Question

Comment puis-je écrire une regex pour faire correspondre une chaîne qui ne rencontre pas un modèle particulier? Je suis confronté à une situation dans laquelle je dois faire correspondre un motif (A et ~ B).

Était-ce utile?

La solution

Vous pouvez utiliser une assertion d'anticipation:

(?!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 arômes d'expression normaux ), 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]

Ceci correspond également à toute séquence de trois chiffres autre que <=>.

Autres conseils

Si vous souhaitez faire correspondre un mot A à une chaîne et non à 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 souhaitez rechercher des lignes de texte ayant un chien comme animal de compagnie et n'ayant 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 modèle et utilisez le langage hôte pour inverser le résultat booléen de la correspondance. Ce sera beaucoup plus lisible et maintenable.

Non, pas pour ressusciter cette question ancienne parce qu’elle avait une solution simple qui n’était pas mentionnée. (Vous avez trouvé votre question lors d'une recherche sur une quête de primes regex .)

  

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

La regex de base pour ceci est extrêmement 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é relatives à l'analyse du code HTML dans les expressions rationnelles): A correspond aux chiffres, B correspond aux chiffres situés entre <a tag

La regex: <a.*?<\/a>|(\d+)

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

Référence

Comment faire correspondre un modèle, sauf dans les situations s1, s2, s3

Comment faire correspondre un modèle sauf si ...

Le complément d'un langage standard est également un langage standard, mais pour le construire, vous devez créer le DFA pour la langue standard et transformez tout changement d'état valide en erreur. Voir this pour un exemple. La page ne dit pas qu'elle convertit /(ac|bd)/ en /(a[^c]?|b[^d]?|[^ab])/. La conversion d'un fichier DFA en une expression régulière n'est pas anodine. C’est plus facile si vous pouvez utiliser l’expression régulière sans modification et changer la sémantique dans le code, comme suggéré précédemment.

motif - re

str.split(/re/g) 

retournera tout sauf le motif.

Testez 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 liriez le groupe $2.
  • Le groupe Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)"); a été créé sans capture, ce que vous devriez éviter.

Exemple:

<=>

Le premier groupe de capture spécifie le motif que vous souhaitez éviter. Le dernier groupe de capture capture tout le reste. Lisez simplement ce groupe, <=>.

(B)|(A)

utilisez ensuite les captures du groupe 2 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top