Это не имеет ничего общего с флагом MULTILINE; что вы видите , разница между find()
и matches()
методами. find()
успешен, если совпадение может быть найдено где-либо в целевой строке , в то время matches()
как регулярное выражение соответствует всей строке .
Pattern p = Pattern.compile("xyz");
Matcher m = p.matcher("123xyzabc");
System.out.println(m.find()); // true
System.out.println(m.matches()); // false
Matcher m = p.matcher("xyz");
System.out.println(m.matches()); // true
Кроме того, MULTILINE
это не значит, что вы думаете. Многие люди приходят к выводу, что вы должны использовать этот флаг, если ваша целевая строка содержит новые строки, то есть если она содержит несколько логических строк. Я видел несколько ответов на SO на этот счет, но на самом деле все, что делает флаг, это изменяет поведение якорей, ^
и $
.
Обычно ^
соответствует самому началу целевой строки и $
самому концу (или перед новой строкой в конце, но мы пока оставим это в стороне). Но если строка содержит символы новой строки, вы можете выбрать ^
и $
сопоставлять начало и конец любой логической строки, а не только начало и конец всей строки, установив флаг MULTILINE.
Так что забудьте о том, что MULTILINE
значит, и просто вспомните, что он делает : меняет поведение ^
и $
якоря. DOTALL
Режим первоначально назывался «однострочным» (и до сих пор присутствует в некоторых вариантах, включая Perl и .NET), и он всегда вызывал подобную путаницу. Нам повезло, что в этом случае разработчики Java получили более описательное имя, но разумной альтернативы для «многострочного» режима не было.
В Perl, где все это безумие началось, они признали свою ошибку и избавились от «многострочных» и «однострочных» режимов в регулярных выражениях Perl 6. Через двадцать лет, возможно, весь остальной мир последует их примеру.