12
votes

Définition d'une expression régulière JavaScript qui correspond à tout sauf une chaîne particulière

OK, je me sens assez épais en ce moment. Fondamentalement, je veux définir une expression régulière JavaScript qui correspondra à tout sauf em> une chaîne particulière. Donc, disent que j'ai la chaîne xxx pré>

ou p> xxx pré>

Je veux une seule expression régulière autonome telle qu'elle correspond à la chaîne p > xxx pré>

ou la chaîne p> xxx pré>

juste pas "chien" ou "chat" seul. J'ai essayé cela, qui dit essentiellement, ignore tout ce qui commence par «Cat» ou «chien», ce qui n'est pas exactement ce dont j'ai besoin ... P>

var pattern= /^(?!dog|cat).+/

pattern.test("cat") // false, as expected
pattern.test("dog") // false, as expected
pattern.test("bananananana") // true
pattern.test("dogsled") // false, but the regexp I want would return true


5 commentaires

+1 pour donner à la regex une go. Tant de Regex Les questions sont simplement "je peux avoir un code de code".


Pourquoi ne pas simplement nier simplement? ! string.match (/ ^ chien | $ $ /)


@Linuskleen ha ha ha super nom d'utilisateur pour une question de regex :-)


Attendez, pourquoi pas str! = "Chien" ?


@ Linuskleen- Merci, mais j'essaie explicitement d'éviter la négation de la valeur de retour pour obtenir ce que je veux, c'est-à-dire que je veux une expansion pure qui retournerait vrai ou faux dans l'affaire ci-dessus


3 Réponses :


0
votes

Je pense que cela devrait faire le truc: xxx


1 commentaires

Ceci correspond à la fois chien et chat .



4
votes

Je semble rappeler des assertions négatives à l'avenir ( (?! ...) code>) ne sera pas entièrement pris en charge dans tous les interprètes JavaScript. Une simple négation sur le résultat de la regex devrait également suffire, non?

var pattern = /^cat|dog$/;

!pattern.test("cat");           // => false
!pattern.test("dog");           // => false
!pattern.test("bananananana");  // => true
!pattern.test("dogsled");       // => true


1 commentaires

Ah bon? Je sais que JavaScript ne supporte pas les points de vue, mais je n'étais au courant d'aucun problème avec des lookaheads (positifs ou négatifs).



10
votes

J'opter pour annuler tout simplement un match comme il est indiqué dans Linus Kleen de réponse. Toutefois, si vous devez absolument tout faire en regex (ou pour l'expérience d'apprentissage ou quelque chose) alors je pense que ce qui suit devrait fonctionner:

^((dog|cat(?!$)).+|(?!dog|cat).+)$


2 commentaires

Excellent. Plus deux (si je pouvais).


@ Eldarerathis - L'exigence de regex que la correspondance ne correspond à des contraintes d'intégration, ce qui convient parfaitement! Une négation simple aurait été ma préférence aussi, mais cela fonctionne. Merci!