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.

159
demandé sur Alan Moore 2009-03-04 21:37:55

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 .

184
répondu Gumbo 2016-07-20 00:08:54

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
28
répondu Aleks 2013-02-21 14:00:24

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.

15
répondu Ben S 2009-03-04 18:48:29

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

Comment faire correspondre un modèle à moins de...

7
répondu zx81 2017-05-23 12:18:17

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.

4
répondu Juliano 2012-08-21 10:36:31

- re

str.split(/re/g) 

retournera tout sauf le motif.

essai ici

1
répondu unigogo 2009-03-05 02:26:17

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, .

0
répondu Timo 2017-05-23 11:47:15
(B)|(A)

ensuite, utilisez ce que le groupe 2 capture...

0
répondu DW. 2017-07-22 20:41:36