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é.
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)