Correspond à tout sauf pour les chaînes spécifiées

Je sais que la regex suivante correspondra à “rouge”, “vert” ou “bleu”.

red|green|blue 

Existe-t-il un moyen simple de le faire correspondre à tout sauf plusieurs chaînes spécifiées?

Si vous voulez vous assurer que la chaîne n’est ni rouge, ni verte ni bleue, la réponse de caskey est la suivante. Ce qui est souvent recherché, cependant, c’est de s’assurer que la ligne ne contient pas de rouge, de vert ou de bleu. Pour cela, ancrez l’expression régulière avec ^ et incluez .* Dans le champ négatif:

 ^(?!.*(red|green|blue)) 

Supposons également que vous souhaitiez des lignes contenant le mot “engine” mais sans aucune de ces couleurs:

 ^(?!.*(red|green|blue)).*engine 

Vous pourriez penser que vous pouvez factoriser le .* tête de l’expression régulière:

 ^.*(?!red|green|blue)engine # Does not work 

mais tu ne peux pas. Vous devez avoir les deux instances de .* Pour que cela fonctionne.

Dépend de la langue, mais il y a généralement des assertions négatives que vous pouvez mettre comme ceci:

 (?!red|green|blue) 

(Merci pour le correctif de la syntaxe, ce qui précède est valide Java et Perl, YMMV)

Vous n’avez pas besoin de regarder négatif. Il y a un exemple de travail:

 /([\s\S]*?)(red|green|blue)/g 

La description:

  • [\s\S] – correspond à tout caractère
  • * – match de 0 à illimité du groupe précédent
  • ? – correspondre le moins possible
  • (red|green|blue) – correspond à l’un de ces mots
  • g – répéter le motif

Exemple:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

Sera:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

Testez-le: regex101.com

Prend 1155 étapes, mais si quelqu’un peut améliorer je serai apprécié.

Correspondant à tout sauf aux chaînes de caractères

Si vous voulez faire correspondre la chaîne entière où vous voulez faire correspondre tout mais certaines chaînes, vous pouvez le faire comme ceci:

^(?!(red|green|blue)$).*$

Ceci dit, commencez le match à partir du début de la chaîne où il ne peut ni commencer ni se terminer par le rouge, le vert ou le bleu et correspondre à tout autre élément à la fin de la chaîne.

Vous pouvez l’essayer ici: https://regex101.com/r/rMbYHz/2

Notez que cela ne fonctionne qu’avec les moteurs de regex qui prennent en charge une lecture négative .

J’avais la même question, les solutions proposées fonctionnaient presque mais elles posaient problème. Au final, le regex que j’ai utilisé est:

 ^(?!red|green|blue).* 

Je l’ai testé en Javascript et .NET.

. * ne devrait pas être placé dans la tête de lecture négative comme ceci: ^ (?!. * rouge | vert | bleu) ou le premier élément se comporterait différemment du rest (c.-à-d. anothergreen “serait)