2009-10-08 5 views
33

J'ai une chaîne A et je veux tester si une autre chaîne B n'en fait pas partie. C'est une très simple regex dont le résultat peut être inversé par la suite.Comment puis-je inverser une expression régulière en JavaScript?

que je pouvais faire:

/foobar/.test('[email protected]') 

et retourner par la suite, comme ceci:

!(/foobar/).test('[email protected]') 

Le problème que j'ai est, que je dois le faire dans l'expression régulière et non avec leur résultat. Quelque chose comme:

/!foobar/.test('[email protected]') 

(qui ne fonctionne pas)

En d'autres termes: l'expression régulière doit tester une non-existence et de retour vrai dans ce cas.

Est-ce possible avec JavaScript?

Répondre

44

Essayez:

/^(?!.*foobar)/.test('[email protected]') 

A (courte) explication:

^   # start of the string 
(?!  # start negative look-ahead 
    .*  # zero or more characters of any kind (except line terminators) 
    foobar # foobar 
)   # end negative look-ahead 

Donc, en clair, que regex se penchera dès le début de la chaîne si la chaîne 'toto' peut être "vu". S'il peut être "vu", il y a non *.

* pas de correspondance car c'est négatif look-ahead!

En savoir plus sur ce genre de choses look-ahead: http://www.regular-expressions.info/lookaround.html Mais Notez que JavaScript ne supporte que regarder discontinues effectuées, aucun behinds Look-!

+0

Nice - pourriez-vous expliquer cela? – jantimon

+0

Thx Je n'ai jamais vu?! avant. Grande réponse – jantimon

+0

Super, c'était exactement ce dont j'avais besoin. Je n'ai pas essayé le lookahead négatif en JavaScript avant. Merci beaucoup! – acme

0

Si ce que vous recherchez est vraiment pas plus compliqué qu'une simple chaîne comme « foobar »:

if (yourString.indexOf("foobar") === -1) { 
    // ... 
} 

http://www.w3schools.com/jsref/jsref_indexOf.asp

+0

Merci, mais il doit être une expression régulière, je viens de simplifier l'exemple un peu. – acme

+0

ou yourString.includes ("foobar") :) – rogerdpack

0
^(?!.*(word1|word2|word3)) 

correspondra une chaîne qui ne contient pas de de word1, word2, ou word3 (et vous pouvez étendre la liste indéfiniment). Mais cela correspond aussi aux chaînes nulles. Pour rejeter les valeurs nulles, utilisez

^(?!$)(?!.*(word1|word2|word3)) 
1

Voici un exemple d'une inégalité. D'abord j'isole l'opérateur '<', plus tard les opérandes 'a' et 'b'. Fondamentalement, je prends l'expression directe, l'inclue dans les parenthèses droites, inverser ce dernier par '^' et finalement incorporer l'expression résultante entre crochets, car le '^' au début serait interprété différemment. P.: J'ai simplement ajouté l'espace vide dans l'expression inverse, afin de récupérer la correspondance exacte pour les opérandes.

Questions connexes