2010-10-28 18 views
7

Ich habe diese regex, die Satz-Trennzeichen entfernen, soll (. und ?):Einfache Java regex nicht funktioniert

sentence = sentence.replaceAll("\\.|\\?$",""); 

Es funktioniert gut, es wandelt

"I am Java developer." zu "I am Java developer"

"Am I a Java developer?" zu

Aber nach der Bereitstellung w e festgestellt, dass es auch in dem Satz als

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

Warum geschieht dies alle anderen Punkte ersetzt?

Antwort

14

The pipe (|) hat die niedrigste Priorität aller Betreiber. So Ihre regex:

\\.|\\?$ 

wird behandelt wie:

(\\.)|(\\?$) 

, die ein . Spiele überall im String und entspricht ein ? am Ende des Strings.

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

(?:\\.|\\?)$ 

Sie auch nutzen könnten: sind

[.?]$ 

Innerhalb einer Zeichenklasse . und ? wahrsten Sinne des Wortes so behandelt man braucht entkomme ihnen nicht.

+0

Danke für die klare Erklärung. Es funktioniert jetzt. – user489849

+1

+1 Schöne Erklärung. – jensgram

+1

Wenn Sie jemandem danken, überprüfen Sie seine Antwort als nützlich, das ist ein Minimum ;-). +1 für die detaillierte Erklärung –

3

Sie haben vergessen, die Satzende Zeichen mit runden Klammern zu umarmen:

sentence = sentence.replaceAll("(\\.|\\?)$",""); 

Der bessere Ansatz ist vorgeschlagen [.?]$ wie @ Mark Byers zu verwenden.

sentence = sentence.replaceAll("[.?]$",""); 
7

Ihr Problem ist wegen der niedrigen precedence der alternation operator|. Ihr regulärer Ausdruck bedeutet Spiel eines der folgenden:

  • . überall oder
  • ? am Ende einer Zeile.

eine Zeichenklasse Verwenden Sie stattdessen:

"[.?]$" 
8

Was Sie sagen mit "\\.|\\?$" ist „entweder eine Periode“ oder „ein Fragezeichen als das letzte Zeichen“.

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

+0

Nicht die einzige mit dieser Idee, es scheint :) – jensgram

+1

+1, um Noten mit Mark Byers auszurichten, da sie gleiche Antworten sind: p –