Ваше выражение RegEx немного не в порядке .Попробуйте это:
System.out.println("I end with a number 4".matches("^.*\\d$"));
Вы также можете просто проверить, как это, если вы оцениваете строку за раз:
System.out.println("I end with a number 4".matches(".*\\d"));
Ваше исходное выражение, без. * Только проверено, чтобы увидеть,строка была числом и не учитывала текст, который может предшествовать этому числу.Вот почему это всегда было ложно.
Следующее действительно оценивает как истинное:
System.out.println("4".matches("^\\d$"));