Regex für das Abgleichen von etwas, wenn ihm nichts anderes vorangestellt ist

163

Mit Regex in Java möchte ich einen Regex schreiben, der genau dann übereinstimmt, wenn dem Muster bestimmte Zeichen nicht vorangestellt sind. Beispielsweise:

String s = "foobar barbar beachbar crowbar bar ";

Ich möchte übereinstimmen, wenn der Leiste nicht foo vorangestellt ist. Die Ausgabe wäre also:

barbar
beachbar
crowbar
bar

Ich weiß, dass dies wahrscheinlich eine sehr einfache Frage ist. Ich versuche, Regex zu lernen, aber in der Zwischenzeit brauche ich etwas, um jetzt zu arbeiten.

b3bop
quelle

Antworten:

276

Sie möchten negative lookbehindwie folgt verwenden:

\w*(?<!foo)bar

Wobei (?<!x)"nur wenn es nicht" x "vor diesem Punkt hat" bedeutet.

Weitere Informationen finden Sie unter Reguläre Ausdrücke - Lookaround .

Bearbeiten : Fügte das hinzu \w*, um die Charaktere vorher zu erfassen (zB "Strand").

Adam Rofer
quelle
2
Welche Änderungen müssen vorgenommen werden, damit sie nicht mit foo_arbitrary_bar übereinstimmen? dh foo nicht unmittelbar vor Bar
Brad Kent
1
@BradKent (?<!foo).*barwürde so etwas passen, glaube ich.
Emyller
@ Emyller Nein. das wird foobazbar entsprechen (foo kommt nicht vor foobazbar, also passt es)
Brad Kent
2
@BradKent Ich habe dein "nicht" in "nicht übereinstimmen" nicht gelesen, deshalb habe ich gesagt, dass es übereinstimmen würde. Ihr Fall sieht \b(?!foo)\w*bar\bfür mich dann wie ein aus .
Emyller
4
@BradKent Dann können Sie entweder eine neue Frage stellen und detailliert erläutern, was Sie erreichen möchten, oder mit regulären Ausdrücken weiterspielen, bis Sie sie selbst finden. :)
Emyller