J'ai besoin d'une regex qui correspondra blahfooblah
mais pasblahfoobarblah
Je veux qu'il ne corresponde qu'à foo et tout autour de foo, tant qu'il n'est pas suivi de bar.
J'ai essayé d'utiliser ceci: ce foo.*(?<!bar)
qui est assez proche, mais cela correspond blahfoobarblah
. Le regard négatif derrière doit correspondre à tout et pas seulement à la barre.
Le langage spécifique que j'utilise est Clojure qui utilise des expressions régulières Java sous le capot.
EDIT: Plus précisément, j'en ai aussi besoin pour passer blahfooblahfoobarblah
mais pas blahfoobarblahblah
.
Réponses:
Essayer:
Tests:
Explication des expressions régulières
Autre regex
Si vous souhaitez exclure uniquement
bar
lorsque c'est juste aprèsfoo
, vous pouvez utiliserÉditer
Vous avez mis à jour votre question pour la rendre spécifique.
Nouveaux tests
Nouvelle explication
(?=.*foo(?!bar))
garantit qu'unfoo
est trouvé mais n'est pas suivi directementbar
la source
foo
mais pasfoobar
. Pour correspondrebot
mais pasbotters
, vous utiliseriez/(?=.*bot(?!ters))^(\w+)$/
.Pour faire correspondre une
foo
suite à quelque chose qui ne commence pas parbar
, essayezVotre version avec un look-back négatif est en fait "match a
foo
suivi de quelque chose qui ne se termine pas parbar
". Le.*
correspond à tousbarblah
, et le(?<!bar)
regarde en arrièrelah
et vérifie qu'il ne correspond pasbar
, ce qui n'est pas le cas, donc tout le modèle correspond.la source
Utilisez plutôt une perspective négative:
Cela a fonctionné pour moi, j'espère que cela aide. Bonne chance!
la source
Vous avez écrit un commentaire vous suggérant de faire correspondre tous les mots d'une chaîne plutôt que la chaîne entière elle-même.
Plutôt que d'écraser tout cela dans un commentaire, je le publie comme une nouvelle réponse.
Nouveau Regex
Exemple de texte
Allumettes
la source
Votre demande de correspondance spécifique peut être assortie de:
Cela correspondra
blahfooblahfoobarblah
mais pasblahfoobarblahblah
.Le problème avec votre regex de
foo.*(?<!bar)
est l'.*
aprèsfoo
. Il correspond à autant de caractères, y compris les caractères aprèsbar
.la source