J'ai une liste de chaînes. Certains d'entre eux sont de la forme 123-...456
. La partie variable "..." peut être:
- la chaîne "pomme" suivie d'un trait d'union, par exemple
123-apple-456
- la chaîne "banana" suivie d'un trait d'union, par exemple
123-banana-456
- une chaîne vide, par exemple
123-456
(notez qu'il n'y a qu'un seul tiret)
Tout mot autre que "pomme" ou "banane" n'est pas valide.
Pour ces trois cas, je voudrais faire correspondre respectivement "pomme", "banane" et "". Notez que je ne veux jamais capturer le trait d'union, mais je veux toujours le faire correspondre . Si la chaîne n'est pas de la forme 123-...456
décrite ci-dessus, il n'y a aucune correspondance.
Comment puis-je écrire une expression régulière pour ce faire? Supposons que j'ai une saveur qui autorise les groupes d'anticipation, de recherche, de recherche et de non capture.
L'observation clé ici est que lorsque vous avez "pomme" ou "banane", vous devez également avoir le trait d'union, mais vous ne voulez pas le faire correspondre. Et lorsque vous faites correspondre la chaîne vide, vous ne devez pas avoir le trait d'union de fin. Une expression régulière qui résume cette affirmation sera la bonne, je pense.
Réponses:
La seule façon de ne pas capturer quelque chose consiste à utiliser des assertions indirectes :
Parce que même avec des groupes non capturants,
(?:…)
l'expression régulière entière capture leur contenu correspondant. Mais cette expression régulière ne correspond qu'àapple
oubanana
si elle est précédée123-
et suivie de-456
, ou si elle correspond à la chaîne vide si elle est précédée123-
et suivie de456
.la source
Mise à jour: Merci à Germán Rodríguez Herrera!
En javascript, essayez:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
N'oubliez pas que le résultat est dans le groupe 1
Démo Debuggex
la source
Essayer:
Cela correspond
apple
,banana
ou une chaîne vide, et après il y aura un 0 ou 1 des traits d' union. J'avais tort de ne pas avoir besoin d'un groupe de capture. Que je suis bête.la source
J'ai modifié l'une des réponses (par @ op1ekun):
La raison en est que la réponse de @ op1ekun correspond également
"123-apple456"
, sans le trait d'union après apple.la source
Essaye ça:
la source
apple
oubanana
ou "". Toutes les autres valeurs sont invalides, comme je l'ai indiqué.Variation de l'expression de @Gumbo qui utilise
\K
pour réinitialiser les positions de correspondance afin d'empêcher l'inclusion de blocs de numéros dans la correspondance. Utilisable dans les saveurs regex PCRE.Allumettes:
la source
De loin le plus simple (fonctionne pour python) est
'123-(apple|banana)-?456'
.la source
123-apple456
donc ce n'est pas correct.