web-dev-qa-db-fra.com

Inverser la correspondance avec l'expression rationnelle

Avec PCRE, comment pouvez-vous construire une expression qui ne correspondra que si une chaîne est pas trouvée.

Si j'utilisais grep (ce que je ne suis pas), je voudrais l'option -v.

Un exemple plus concret: je veux que mon expression rationnelle corresponde à si la chaîne foo est pas dans la chaîne. Donc, cela correspondrait à bar mais pas à foobar.

28
Joe Beda

D'accord, j'ai affiné mon expression régulière en fonction de la solution que vous avez trouvée (qui correspond à tort aux chaînes commençant par "test").

^((?!foo).)*$

Cette expression régulière ne correspondra qu'aux chaînes qui ne contiennent pas foo. Le premier lookahead refusera les chaînes commençant par 'foo', et le second s'assurera que foo ne se trouve pas ailleurs dans la chaîne.

51

Sur la base de la réponse de Daniel, je pense que j'ai quelque chose qui fonctionne:

^(.(?!test))*$

La clé est que vous devez faire l'affirmation négative sur chaque caractère de la chaîne

4
Joe Beda

J'ai déjà répondu à cette question pour quelqu'un, voir ces liens:

2
Sasha Chedygov

C'est en effet presque un doublon. Je suppose que l'expression régulière que vous recherchez est

(?! foo). *

1