2015-04-16 17 views
6

Ich habe seit Ewigkeiten mit dieser Regex in Java zu spielen und kann nicht an die Arbeit:Java Regex ersetzen alle alle Worte nicht ersetzen

(?:^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?: |$) 

Die folgende:

pattern.matcher("the cat in the hat").replaceAll(" ") 

gibt mich cat the hat. Ein anderes Beispiel ist , was mir cat of next hat gibt.

Gibt es eine Möglichkeit, wie ich diesen Regex-Ersatz arbeiten kann, ohne sie in mehrere separate Regexes für jedes Wort zu zerlegen und eine Zeichenfolge wiederholt zu ersetzen? Ja

Antwort

10

, können Sie dies ziemlich leicht Sie nur boundaries verwenden müssen, das ist, was Sie versuchen, mit beschreiben: (?:^|) Genau das tun Sie stattdessen:

\b(?:the|and|at|in|or|on|off|all|beside|under|over|next)\b 

Ihr Original nicht erfassen, aber wie in den Kommentaren erwähnt wird, wenn Sie die Optionen aufnehmen möchten, können Sie eine Erfassung statt einer nicht-Erfassung Gruppe verwenden:

\b(the|and|at|in|or|on|off|all|beside|under|over|next)\b 
+0

Sie könnten auch Match-Gruppen benötigen: '(\ b (?: | | | | | | – frhd

+1

@frhd Die beste Lösung wäre dann, einfach die nicht erfassende Gruppe durch eine erfassende Gruppe zu ersetzen : '\ b (die | und | at | in | oder | on | off | alle | neben | unter | über | nächste) \ b' – sp00m

+0

@ sp00m yep, diese Antwort sollte mit deinem Update aktualisiert werden. – frhd

5

das Problem mit Ihnen ist, dass die vorderen und hinteren Räume in der enthalten sind Übereinstimmungen und ein Zeichen kann nicht in zwei Übereinstimmungen gefunden werden.

So mit dem Eingang the_cat_in_the_hat (die Unterstrichen ersetzen die Räume hier die Erklärung deutlicher zu machen):

  1. Erstes Spiel: the_, Rest string: cat_in_the_hat
  2. zweite Partie: _in_, Rest string: the_hat
  3. the wird nicht abgeglichen, da weder ein Leerzeichen noch der Anfang der (ursprünglichen) Zeichenfolge vorangestellt ist.

Sie verwendet lookarounds stattdessen haben könnte, da sie wie Bedingungen (dh if) verhalten:

(?<=^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?= |$) 

Regular expression visualization

Debuggex Demo

Auf diese Weise würden Sie haben:

  1. Erstes Spiel: the, Rest string: _cat_in_the_hat
  2. zweite Partie: in, Rest string: _the_hat
  3. dritte Partie: the, Rest string: _hat

Aber @JonathanMee answer ist die beste Lösung, da Wort Grenzen wurden für diesen Zweck genau implementiert;)

+1

Dies ist eine ausgezeichnete Beschreibung des Problems, ich bevorzuge meine endgültige Lösung, aber +1, weil dies eine bessere Antwort. –

+2

Nizza Wenn ich zwei Antworten akzeptieren könnte, würde ich! – RTF