Comment puis-je inverser une expression régulière en JavaScript?
-
20-09-2019 - |
Question
J'ai une chaîne A et que vous souhaitez tester si une autre chaîne B ne fait pas partie de celui-ci. C'est un très simple, regex dont le résultat peut être inversé par la suite.
Je pourrais faire:
/foobar/.test('foobar@bar.de')
et inverser ensuite, comme ceci:
!(/foobar/).test('foobar@bar.de')
Le problème que j'ai est, que je dois le faire dans l'expression régulière et non pas avec leur résultat. Quelque chose comme:
/!foobar/.test('foobar@bar.de')
(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?
La solution
Essayez:
/^(?!.*foobar)/.test('foobar@bar.de')
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 ». Si elle peut être "vu" il y a pas * correspondance.
* pas de match parce qu'il 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, pas discontinues effectuées look- behinds
Autres conseils
^(?!.*(word1|word2|word3))
correspondra à une chaîne qui ne contient pas de word1
, word2
ou word3
(et vous pouvez prolonger indéfiniment la liste).
Mais cela correspond aussi à des chaînes nulles. Pour rejeter l'utilisation de valeurs NULL
^(?!$)(?!.*(word1|word2|word3))
Voici un exemple d'une inégalité. D'abord, j'isole l'opérateur « < », plus tard, les opérandes « a » et « b ». Au fond, je prends l'expression directe, inclure dans parenthèses droite, inverser celle-ci par « ^ » et, enfin, l'expression résultante l'intégrer entre crochets, parce que le « ^ » au début sera interprété différemment.
var _str = "a < b" ;
var _op = /</g ;
var _no_op = /[^(<|\ )]/g ;
console.log( _str, _str.match( _op ) ); // get '<'
console.log( _str, _str.match( _no_op ) ); // get 'a', 'b'
P.s .: Je viens d'ajouter l'espace vide dans l'expression inverse, afin de récupérer une correspondance exacte pour les opérandes.
Si ce que vous recherchez est vraiment pas plus compliqué qu'une simple chaîne comme « foobar »:
if (yourString.indexOf("foobar") === -1) {
// ...
}