regex pour faire correspondre quelque chose s'il n'est pas précédé par autre chose

165

Donc, avec regex en java, je veux écrire une regex qui correspondra si et seulement si le modèle n'est pas précédé de certains caractères. Par exemple:

String s = "foobar barbar beachbar crowbar bar ";

Je veux faire correspondre si bar n'est pas précédé de foo. La sortie serait donc:

barbar
beachbar
crowbar
bar

Je sais que c'est probablement une question très simple. J'essaie d'apprendre les regex, mais en attendant, j'ai besoin de quelque chose pour travailler maintenant.

b3bop
la source

Réponses:

278

Vous souhaitez utiliser negative lookbehindcomme ceci:

\w*(?<!foo)bar

(?<!x)signifie "seulement s'il n'y a pas de" x "avant ce point".

Voir Expressions régulières - Rechercher pour plus d'informations.

Edit : ajouté le \w*pour capturer les personnages avant (par exemple "plage").

Adam Rofer
la source
2
quelles modifications doivent être apportées pour ne pas correspondre à foo_arbitrary_bar? ie foo pas immédiatement la mesure précédente
Brad Kent
1
@BradKent (?<!foo).*barcorrespondrait à quelque chose comme ça, je crois.
emyller
@emyller non. qui correspondra à foobazbar (foo ne vient pas avant foobazbar, donc ça correspond)
Brad Kent
2
@BradKent Je n'ai pas lu votre "pas" dans "pas de correspondance", c'est pourquoi j'ai dit que cela correspondrait. Votre cas \b(?!foo)\w*bar\bme ressemble alors.
emyller
4
@BradKent Ensuite, vous pouvez soit poser une nouvelle question, en expliquant en détail ce que vous essayez de réaliser, soit continuer à jouer avec des expressions régulières jusqu'à ce que vous le trouviez vous-même. :)
emyller