5409 votes

Expression régulière pour faire correspondre la chaîne ne contenant ne pas un mot ?

Je sais que c’est possible de faire correspondre le mot et en utilisant les outils options inverser le match. (par exemple. par `` ) Cependant, je voudrais savoir si c’est possible en utilisant des expressions régulières pour faire correspondre les lignes qui ne contiennent un mot spécifique, dire hede ?

Entrée :

``

Sortie :

7459voto

Bart Kiers Points 79069

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' es'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!).

987voto

FireCoding Points 993

Notez que la solution pour ne pas commencer par « hede »:

est généralement beaucoup plus efficace que la solution à ne pas contenir « hede »:

L’ancien vérifie « hede » qu’à la première position de la chaîne d’entrée, plutôt qu’à chaque position.

252voto

Athena Points 2149

Si vous l’utilisez juste pour grep, vous pouvez utiliser `` pour toutes les lignes qui ne contiennent pas de hede.

Oh de l’ETA, la relecture de la question, `` est probablement ce que vous entendez par « outils/options ».

120voto

Hades32 Points 428

Les réponses donnés sont parfaitement bien, juste un point académique :

Les Expressions régulières dans le sens d’informatique théorique Ne sont pas capable faire pareil. Pour eux, elle devait ressembler à ceci :

Cela fait seulement un match complet. Le fait pour des matches serait même plus gênant.

60voto

Josh Lee Points 53741

Une bonne explication pourquoi il n’est pas facile de réduire à néant une regex arbitraire. Voici Je suis d’accord avec les autres réponses, cependant : si c’est autre chose qu’une question hypothétique, une expression régulière n’est pas le bon choix ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X