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.

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").


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.