Я только что наблюдал это поведение;
Pattern p1 = Pattern.compile("^$");
Matcher m1 = p1.matcher("");
System.out.println(m1.matches()); /* true */
Pattern p2 = Pattern.compile("^$", Pattern.MULTILINE);
Matcher m2 = p2.matcher("");
System.out.println(m2.matches()); /* false */
Мне кажется странным, что последнее утверждение ложно. Это то, что говорят документы;
По умолчанию регулярные выражения ^ и $игнорируют линейные терминаторы и соответствуют только в начале и в конце всей входной последовательности. Если режим MULTILINE активирован, то ^ совпадает в начале ввода и после любого терминатора линии, кроме как в конце ввода. Когда в режиме MULTILINE $совпадает только перед терминатором линии или концом входной последовательности. http://docs.oracle.com/javase/1.4.2...
Из чего я получаю от этого, он должен соответствовать? Следующее делает вещи еще более запутанными;
Pattern p3 = Pattern.compile("^test$");
Matcher m3 = p3.matcher("test");
System.out.println(m3.matches()); /* true */
Pattern p4 = Pattern.compile("^test$", Pattern.MULTILINE);
Matcher m4 = p4.matcher("test");
System.out.println(m4.matches()); /* true */
Так что это? Как я могу это понять? Я надеюсь, что кто-то может пролить свет на это, будет очень благодарен.