Simple Java regex funktioniert nicht

7

Ich habe diese Regex, die Satzbegrenzer entfernen soll ( . und ? ):

%Vor%

Es funktioniert gut, es konvertiert

"I am Java developer." bis "I am Java developer"

"Am I a Java developer?" bis "Am I a Java developer"

Aber nach der Bereitstellung haben wir festgestellt, dass es auch andere Punkte im Satz als

ersetzt

"Hi.Am I a Java developer?" wird "HiAm I a Java developer"

Warum passiert das?

    
user489849 28.10.2010, 08:57
quelle

4 Antworten

14

Die Pipe ( | ) hat die niedrigste Priorität aller Operatoren . Also deine Regex:

%Vor%

wird wie folgt behandelt:

%Vor%

entspricht einer . beliebigen Stelle in der Zeichenfolge und entspricht ? am Ende der Zeichenfolge.

Um dies zu beheben, müssen Sie . und ? zusammen wie folgt gruppieren:

%Vor%

Sie können auch verwenden:

%Vor%

Innerhalb einer Zeichenklasse werden . und ? buchstäblich behandelt, so dass Sie nicht entkommen müssen.

    
codaddict 28.10.2010, 08:59
quelle
8

Was Sie mit "\.|\?$" sagen, ist "entweder ein Punkt" oder "ein Fragezeichen als letztes Zeichen".

Ich würde stattdessen "[.?]$" empfehlen, um das verwirrende Entkommen (und natürlich das unerwünschte Ergebnis) zu vermeiden.

    
jensgram 28.10.2010 09:01
quelle
7

Ihr Problem liegt an der Priorität von alternation operator | . Ihr regulärer Ausdruck bedeutet, dass Sie einen der folgenden Werte verwenden:

  • . an beliebiger Stelle oder
  • ? am Ende einer Zeile.

Verwenden Sie stattdessen eine Zeichenklasse:

%Vor%     
Mark Byers 28.10.2010 09:00
quelle
3

Sie haben vergessen, die Satzenden mit runden Klammern zu umarmen:

%Vor%

Der bessere Ansatz ist die Verwendung von [.?]$ wie @Mark Byers vorgeschlagen.

%Vor%     
splash 28.10.2010 08:58
quelle