Dies hat nichts mit dem MULTILINE-Flag zu tun. Was Sie sehen, ist der Unterschied zwischen den find()
und matches()
Methoden. find()
ist erfolgreich, wenn eine Übereinstimmung an einer beliebigen Stelle in der Zielzeichenfolge gefunden werden kann , während matches()
erwartet wird , dass der reguläre Ausdruck mit der gesamten Zeichenfolge übereinstimmt .
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
Darüber hinaus MULTILINE
bedeutet nicht, was Sie denken, dass es tut. Viele Leute scheinen zu dem Schluss zu kommen, dass Sie dieses Flag verwenden müssen, wenn Ihre Zielzeichenfolge Zeilenumbrüche enthält, dh wenn sie mehrere logische Zeilen enthält. Ich habe hier auf SO mehrere Antworten zu diesem Zweck gesehen, aber tatsächlich ändert dieses Flag nur das Verhalten der Anker, ^
und $
.
Entspricht normalerweise ^
dem Anfang der Zielzeichenfolge und $
dem Ende (oder vor einer neuen Zeile am Ende, aber das lassen wir vorerst beiseite). Wenn die Zeichenfolge jedoch Zeilenumbrüche enthält, können Sie am Anfang und am Ende jeder logischen Zeile und nicht nur am Anfang und Ende der gesamten Zeichenfolge auswählen ^
und $
übereinstimmen, indem Sie das Flag MULTILINE setzen.
Vergessen Sie also, was es MULTILINE
bedeutet, und denken Sie daran, was es tut : Ändert das Verhalten der ^
und $
Anker. DOTALL
Der Modus wurde ursprünglich als "einzeilig" bezeichnet (und ist immer noch in einigen Varianten erhältlich, einschließlich Perl und .NET), und hat immer zu ähnlicher Verwirrung geführt. Wir haben das Glück, dass die Java-Entwickler in diesem Fall den aussagekräftigeren Namen gewählt haben, aber es gab keine vernünftige Alternative für den "mehrzeiligen" Modus.
In Perl, wo all dieser Wahnsinn begann, haben sie ihren Fehler eingestanden und sowohl den "mehrzeiligen" als auch den "einzeiligen" Modus in Perl 6-Regexen beseitigt. In weiteren zwanzig Jahren wird vielleicht der Rest der Welt nachziehen.