Regex - comment faire correspondre tout sauf un modèle particulier
Comment puis-je écrire un regex pour correspondre à une chaîne qui ne répond pas à un motif particulier? Je suis confronté à une situation où je dois correspondre à un (A et ~B) modèle.
8 réponses
vous pourriez utiliser une assertion prospective:
(?!999)\d{3}
Cet exemple correspond à trois chiffres autres que 999
.
mais s'il vous arrive de ne pas avoir d'implémentation d'expression régulière avec cette fonctionnalité (voir comparaison des saveurs D'Expression régulière ), vous devrez probablement construire une expression régulière avec les fonctionnalités de base de votre propre initiative.
compatible expression régulière avec la syntaxe de base seulement serait:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
cela correspond aussi à toute séquence à trois chiffres qui n'est pas 999
.
si vous voulez faire correspondre un mot A dans une chaîne et ne pas faire 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 que avoir un chien pour un animal de compagnie et N'a pas de cat 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
Match contre le pattern et utiliser la langue hôte pour inverser le résultat booléen de la match. Ce sera beaucoup plus lisible et maintenable.
notnot, ressuscitant cette ancienne question parce qu'elle avait une solution simple qui n'a pas été mentionnée. (J'ai trouvé votre question en faisant des recherches pour un regex bounty quest .)
je suis confronté à une situation où je dois correspondre à un (A et ~B) modèle.
le regex de base pour ceci est affreusement simple: B|(A)
vous ignorez juste les matchs dans l'ensemble et examiner les captures du Groupe 1, qui contiendra A.
un exemple( avec tous les disclaimers sur l'analyse html dans regex): A est des chiffres, B est des chiffres dans <a tag
La regex: <a.*?<\/a>|(\d+)
Demo (voir Groupe 1 dans la partie inférieure droite)
référence
comment faire correspondre les motifs sauf dans les situations s1, S2, s3
le complément d'une langue régulière est aussi une langue régulière, mais pour la construire vous devez construire le DFA pour la langue régulière, et faire tout changement d'état valide dans une erreur. Voir ce pour un exemple. Ce que la page ne dit pas, c'est qu'elle a converti /(ac|bd)/
en /(a[^c]?|b[^d]?|[^ab])/
. La conversion d'une DFA à une expression régulière n'est pas anodine. Il est plus facile si vous pouvez utiliser l'expression régulière inchangée et changer la sémantique en code, comme suggéré plus haut.
ma réponse ici pourrait résoudre votre problème aussi bien:
https://stackoverflow.com/a/27967674/543814
- au lieu de remplacer, vous utiliseriez Match.
- au lieu du groupe
, vous devez lire le groupe
.
- groupe
a été rendu non-capturing il, ce que vous éviteriez.
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 capturant capture tout le reste. Il suffit de lire ce groupe, .