Heim >Java >javaLernprogramm >Wie unterscheiden sich „Pattern.MULTILINE' und „(?m)' beim Abgleichen von mehrzeiligem Text in regulären Java-Ausdrücken?

Wie unterscheiden sich „Pattern.MULTILINE' und „(?m)' beim Abgleichen von mehrzeiligem Text in regulären Java-Ausdrücken?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-08 16:59:09672Durchsuche

How Do `Pattern.MULTILINE` and `(?m)` Differ When Matching Multiline Text in Java Regular Expressions?

Mehrzeiligen Text mit regulärem Ausdruck abgleichen

Beim Versuch, mehrzeiligen Text in Java abzugleichen, kann es zu Verhaltensunterschieden bei der Verwendung der Pattern-Klasse kommen mit dem Modifikator Pattern.MULTILINE und mit dem Modifikator (?m).

Um die Diskrepanz zu verstehen, ist es wichtig, die zu verstehen Zweck dieser Modifikatoren.

Pattern.MULTILINE und (?m)

Beide Pattern.MULTILINE und (?m) werden verwendet, um das Verhalten von Ankern für reguläre Ausdrücke zu erweitern (^ und $), um nicht nur den Anfang und das Ende der gesamten Zeichenfolge abzugleichen, sondern auch den Anfang und das Ende jeder Zeile innerhalb der string.

Pattern.DOTALL und (?s)

Der Hauptunterschied zwischen diesen Modifikatoren liegt jedoch in der Behandlung von Zeilenumbrüchen (Wagenrücklaufzeichen). Pattern.MULTILINE erweitert die Übereinstimmungsfähigkeit des Platzhalterzeichens Punkt (.) nicht um Zeilenumbruchzeichen. Um sie einzuschließen, müssen Sie Pattern.DOTALL oder (?s) verwenden.

Übereinstimmung mit der Beispielzeichenfolge

In Ihrem Beispiel enthält die Zeichenfolge mehrere Zeilen und Sie Sie möchten einen Text finden, der mit „Benutzerkommentare:“ beginnt. Durch die alleinige Verwendung von Pattern.MULTILINE können die Anker mit dem Anfang jeder Zeile übereinstimmen, das Punktzeichen stimmt jedoch nicht mit Zeilenumbrüchen überein.

Um mehrzeiligen Text korrekt abzugleichen und die Zeichen nach „Benutzerkommentare:“ zu erfassen, sollten Sie dies tun Verwenden Sie Pattern.DOTALL oder (?s) in Verbindung mit Pattern.MULTILINE oder (?m):

Pattern regex = Pattern.compile("^\s*User Comments:\s+(.*)", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group(1);
} 

Dieser reguläre Ausdruck stimmt mit dem Anfang jeder Zeile überein und erfasst weiterhin alle Nicht-Leerzeichen nach „Benutzerkommentare:“.

Das obige ist der detaillierte Inhalt vonWie unterscheiden sich „Pattern.MULTILINE' und „(?m)' beim Abgleichen von mehrzeiligem Text in regulären Java-Ausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn