J'ai une chaîne A et je veux tester si une autre chaîne B n'en fait pas partie. Il s'agit d'une expression régulière très simple dont le résultat peut être inversé par la suite.
Je pourrais faire:
/foobar/.test('[email protected]')
et inversez-le ensuite, comme ceci:
!(/foobar/).test('[email protected]')
Le problème que j'ai, c'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 la non-existence et retourner vrai dans ce cas.
Est-ce possible avec JavaScript?
Essayer:
/^(?!.*foobar)/.test('[email protected]')
Une (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, dans un anglais simple, cette expression régulière apparaîtra depuis le début de la chaîne si la chaîne "foobar" peut être "vue". S'il peut être "vu", il n'y a pas * correspondance.
* pas de correspondance car c'est négatif à venir!
En savoir plus sur ce truc d'anticipation: http://www.regular-expressions.info/lookaround.html Mais notez que JavaScript ne prend en charge que les anticipations, pas de look - derrière !
^(?!.*(Word1|Word2|Word3))
correspondra à une chaîne qui ne contient aucun Word1
, Word2
, ou Word3
(et vous pouvez étendre la liste indéfiniment). Mais cela correspond également aux chaînes nulles. Pour rejeter les null, utilisez
^(?!$)(?!.*(Word1|Word2|Word3))
Voici un exemple d'inégalité. J'isole d'abord l'opérateur '<', puis les opérandes 'a' et 'b'. Fondamentalement, je prends l'expression directe, l'inclus dans les parenthèses droites, inverse cette dernière par '^' et finalement incorpore l'expression résultante entre crochets, car le '^' au début serait 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 la correspondance exacte pour les opérandes.
Si ce que vous recherchez n'est vraiment pas plus compliqué qu'une simple chaîne comme "foobar":
if (yourString.indexOf("foobar") === -1) {
// ...
}