Regex – comment faire correspondre tout sauf un modèle particulier

Comment écrire une regex pour correspondre à une chaîne qui ne correspond pas à un modèle particulier? Je suis confronté à une situation où je dois correspondre à un modèle (A et ~ B).

Vous pouvez utiliser une assertion anticipée:

(?!999)\d{3} 

Cet exemple correspond à trois chiffres autres que 999 .


Mais si vous ne possédez pas d’implémentation d’une expression régulière avec cette fonctionnalité (voir Comparaison des saveurs des expressions régulières ), vous devrez probablement créer une expression régulière avec les fonctionnalités de base par vous-même.

Une expression régulière compatible avec la syntaxe de base uniquement serait:

 [0-8]\d\d|\d[0-8]\d|\d\d[0-8] 

Cela correspond également à une séquence de trois chiffres différente de 999 .

Si vous souhaitez faire correspondre un mot A dans une chaîne et ne pas correspondre à un mot B. Par exemple: Si vous avez un texte:

 1. I have a two pets - dog and a cat 2. I have a pet - dog 

Si vous voulez rechercher des lignes de texte qui ont un chien pour un animal de compagnie et qui n’a pas de chat, vous pouvez utiliser cette expression régulière:

 ^(?=.*?\bdog\b)((?!cat).)*$ 

Il ne trouvera que la deuxième ligne:

 2. I have a pet - dog 

Faites correspondre le motif et utilisez le langage hôte pour inverser le résultat booléen de la correspondance. Ce sera beaucoup plus lisible et maintenable.

notnot, ressusciter cette ancienne question car il y avait une solution simple qui n’était pas mentionnée. (Vous avez trouvé votre question en faisant quelques recherches pour une quête de primes regex .)

Je suis confronté à une situation où je dois correspondre à un modèle (A et ~ B).

La regex de base pour ceci est terriblement simple: B|(A)

Vous ignorez simplement les correspondances globales et examinez les captures du groupe 1, qui contiendront A.

Un exemple (avec tous les avertissements sur l’parsing syntaxique de HTML dans les regex): A est un chiffre, B est un chiffre dans

L'expression rationnelle: |(\d+)

Démo (regardez le groupe 1 dans le volet inférieur droit)

Référence

Comment faire correspondre le motif sauf dans les situations s1, s2, s3

Comment faire correspondre un motif sauf si ...

Le complément d’un langage standard est également un langage régulier, mais pour le construire, vous devez créer le DFA pour le langage standard et faire en sorte que tout changement d’état valide devienne une erreur. Voir ceci pour un exemple. Qu’est-ce que la page ne dit pas, c’est qu’il a converti /(ac|bd)/ en /(a[^c]?|b[^d]?|[^ab])/ . La conversion d’un DFA à une expression régulière n’est pas sortingviale. Il est plus facile d’utiliser l’expression régulière sans modifier la sémantique du code, comme suggéré précédemment.

modèle – re

 str.split(/re/g) 

renverra tout sauf le motif.

Tester ici

Ma réponse ici pourrait également résoudre votre problème:

https://stackoverflow.com/a/27967674/543814

  • Au lieu de remplacer, vous utiliseriez Match.
  • Au lieu du groupe $1 , vous lisez le groupe $2 .
  • Le groupe $2 été rendu non capturé, ce que vous éviterez.

Exemple:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

Le premier groupe de capture spécifie le motif que vous souhaitez éviter. Le dernier groupe de capture capture tout le rest. Lisez simplement ce groupe, $2 .

 (B)|(A) 

puis utilisez ce que le groupe 2 capture …