Le fait que la regex ne prend pas en charge la correspondance inverse n'est pas entièrement vrai. Vous pouvez reproduire ce comportement en utilisant négative chercher des solutions de rechange:
^((?!hede).)*$
L'expression régulière ci-dessus correspondent à n'importe quelle chaîne de caractères, ou de la ligne, sans saut de ligne, pas contenant la sous-chaîne 'hede'.
Comme mentionné, ce n'est pas quelque chose de regex est "bonne" à " (ou devrait faire), mais encore, il est possible.
Et si vous avez besoin pour correspondre à la rupture de ligne de caractères, utilisez le POINT-TOUS les modificateur (le suiveur s
dans le schéma suivant):
/^((?!hede).)*$/s
ou l'utiliser en ligne:
/(?s)^((?!hede).)*$/
(où l' /.../
sont les regex délimiteurs, c'est à dire pas partie du modèle)
Si la DOT-TOUS modificateur n'est pas disponible, vous pouvez reproduire le même comportement avec la classe de caractères [\s\S]
:
/^((?!hede)[\s\S])*$/
Explication
Une chaîne est juste une liste d' n
caractères. Avant et après chaque personnage, il y a une chaîne vide. Donc, une liste d' n
personnages devront n+1
des chaînes vides. Considérez la chaîne "ABhedeCD"
:
+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+
S = |e1| A |e2| B |e3| h |e4| e |e5| d |e6| e |e7| C |e8| D |e9|
+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+
index 0 1 2 3 4 5 6 7
où l' e
s'sont des chaînes vides. La regex (?!hede).
ressemble à l'avance pour voir si il n'y a pas de sous-chaîne "hede"
d'être vu, et si c'est le cas (si quelque chose d'autre qui est vu), puis l' .
(dot) correspond à tout caractère sauf un saut de ligne. Rechercher des solutions de rechange sont également appelés à zéro de largeur d'affirmations parce qu'ils ne pas consommer tous les caractères. Ils ne assert/valider quelque chose.
Donc, dans mon exemple, chaque chaîne vide est d'abord validé pour voir si il n'y a pas d' "hede"
jusqu'à l'avance, avant qu'un personnage est consommée par l' .
(dot). La regex (?!hede).
fera qu'une seule fois, de sorte qu'il est enveloppé dans un groupe, et répété zéro, une ou plusieurs fois: ((?!hede).)*
. Enfin, le début et la fin de l'entrée sont ancrés assurez-vous que l'ensemble de l'entrée est de la consommation d' ^((?!hede).)*$
Comme vous pouvez le voir, l'entrée "ABhedeCD"
échouent parce que sur e3
, la regex (?!hede)
d'échec (il est "hede"
jusqu'à l'avant!).