Я думаю, что главная проблема здесь заключается в неожиданном поведении matches()
: любое совпадение должно потреблять всю входную строку . Оба ваших примера терпят неудачу, потому что регулярные выражения не потребляют перевод строки в конце строки. Якоря не имеют к этому никакого отношения.
В большинстве языков совпадение с регулярным выражением может происходить где угодно, потребляя всю, некоторую часть или ни одну из входной строки. И у Java есть метод Matcher#find()
, который выполняет это традиционное соответствие. Однако результаты противоположны тому, что вы сказали, что ожидали:
Pattern.compile("StackOverflow\\z").matcher("StackOverflow\n").find() //false
Pattern.compile("StackOverflow\\Z").matcher("StackOverflow\n").find() //true
В первом примере \z
должен соответствовать концу строки, но конечный перевод строки не выполняется. Во втором * \Z
совпадает до перевода строки, который находится в конце строки.