Réponses:
Vous pouvez utiliser une assertion anticipée:
(?!999)\d{3}
Cet exemple correspond à trois chiffres autres que 999
.
Mais si vous n'avez pas d'implémentation d'expression régulière avec cette fonctionnalité (voir Comparaison des saveurs d'expressions régulières ), vous devez probablement créer vous-même une expression régulière avec les fonctionnalités de base.
Une expression régulière compatible avec une syntaxe de base uniquement serait:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Cela correspond également à toute séquence de trois chiffres qui ne l'est pas 999
.
Si vous souhaitez 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 qui ont un chien pour un animal de compagnie et qui n'ont 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
findstr
commande DOS . Il n'offre qu'un petit sous-ensemble des fonctionnalités que vous vous attendez à trouver dans un outil regex; lookahead n'en fait pas partie. (Je viens d'ajouter la balise findstr moi-même.)
Faites correspondre le modèle et utilisez la langue hôte pour inverser le résultat booléen de la correspondance. Ce sera beaucoup plus lisible et maintenable.
non pas, ressuscitant cette ancienne question parce qu'elle avait une solution simple qui n'était pas mentionnée. (Vous avez trouvé votre question en faisant des recherches pour une quête de primes regex .)
Je suis confronté à une situation où je dois faire correspondre un motif (A et ~ B).
L'expression régulière de base pour cela est terriblement simple: B|(A)
Vous ignorez simplement les correspondances globales et examinez les captures du groupe 1, qui contiendront A.
Un exemple (avec toutes les clauses de non-responsabilité concernant l'analyse du code HTML dans l'expression régulière): A est des chiffres, B est des chiffres dans <a tag
Le regex: <a.*?<\/a>|(\d+)
Démo (regardez le groupe 1 dans le volet inférieur droit)
Référence
Comment faire correspondre le modèle sauf dans les situations s1, s2, s3
\d
par [[:digit:]]
. La première référence mentionne qu'elle est spécifique à Perl et PHP: "Il existe une variante utilisant une syntaxe spécifique à Perl et PHP qui accomplit la même chose."
Le complément d'une langue standard est également une langue standard, mais pour le construire, vous devez créer le DFA pour la langue standard et transformer tout changement d'état valide en erreur. Voir ceci pour un exemple. Ce que la page ne dit pas, c'est qu'elle a été convertie /(ac|bd)/
en /(a[^c]?|b[^d]?|[^ab])/
. La conversion d'un DFA en une expression régulière n'est pas anodine. C'est plus facile si vous pouvez utiliser l'expression régulière inchangée et changer la sémantique dans le code, comme suggéré précédemment.
replace
str.replace(/re/g, '')
, alors il n'est pas nécessaire de les rejoindre. aussi si vous lancez une belle traîne \ s? comme str.replace(/\re\s?/g, '')
alors vous vous débarrassez de tous les espaces en double que vous auriez du remplacement de quelque chose au milieu d'une chaîne
Ma réponse ici pourrait également résoudre votre problème:
https://stackoverflow.com/a/27967674/543814
$1
, vous liriez groupe $2
.$2
été rendu non capturant là-bas, ce que vous éviteriez.Exemple:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Le premier groupe de capture spécifie le modèle que vous souhaitez éviter. Le dernier groupe de capture capture tout le reste. Lisez simplement ce groupe $2
,.
findstr
balise car toutes les réponses ici ne sont pas valides pour la balise.