296 votes

Comment faire correspondre, mais pas capturer, une partie d'une expression rationnelle ?

J'ai une liste de chaînes. Certaines d'entre elles sont de la forme 123-...456 . La partie variable "..." peut être :

  • la chaîne "apple" suivie d'un trait d'union, par exemple 123-apple-456
  • la chaîne "banane" suivie d'un trait d'union, par exemple 123-banana-456
  • une chaîne vide, par exemple 123-456 (noter qu'il n'y a qu'un seul trait d'union)

Tout mot autre que "pomme" ou "banane" est invalide.

Dans ces trois cas, j'aimerais faire correspondre "apple", "banana" et "", respectivement. Notez que je ne veux jamais capturer le trait d'union, mais je veux toujours correspondre il. Si la chaîne n'est pas de la forme 123-...456 comme décrit ci-dessus, il n'y a pas de correspondance du tout.

Comment écrire une expression régulière pour faire cela ? Supposons que j'ai une saveur qui autorise les groupes lookahead, lookbehind, lookaround et non-capturing.


L'observation clé ici est que lorsque vous avez une "pomme" ou une "banane", vous avez doit également ont le trait d'union de fin, mais vous ne voulez pas le faire correspondre. Et lorsque vous faites correspondre la chaîne vide, vous ne doit pas ont un trait d'union à la fin. Une regex qui encapsule cette assertion sera la bonne, je pense.

0 votes

Vous voulez que tout corresponde, sauf les traits d'union ?

0 votes

J'ai un exemple beaucoup plus simple, j'ai me@company.org et je veux faire correspondre la société afin de la remettre pour un traitement ultérieur.

0voto

oriberu Points 11

Une variante de l'expression de @Gumbo qui fait usage de \K pour réinitialiser les positions du match afin d'empêcher l'inclusion de blocs de numéros dans le match. Utilisable dans les variantes de regex de PCRE.

123-\K(?:(?:apple|banana)(?=-456)|456\K)

Matchs :

Match 1  apple
Match 2  banana
Match 3

-5voto

johmsp Points 290

La solution la plus simple (qui fonctionne en python) est de loin la suivante '123-(apple|banana)-?456' .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X