web-dev-qa-db-fra.com

Comment inverser une expression régulière en JavaScript?

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?

44
acme

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 !

61
Bart Kiers
^(?!.*(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))  
2
thing241

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.

1
Sandro Rosa

Si ce que vous recherchez n'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
Brian Kelly