Comment faire correspondre, mais pas de capture, partie d'une regex?
J'ai une liste de chaînes de caractères. Certains d'entre eux sont de la forme 123-...456
. La partie variable "..." peut être:
- la chaîne "apple" suivi d'un tiret, par exemple
123-apple-456
- la chaîne "banane" suivi d'un tiret, par exemple
123-banana-456
- une chaîne vide, par exemple
123-456
(remarque il n'y a qu'un trait d'union)
Un mot autre que "apple" ou "banane" n'est pas valide.
Pour ces trois cas, je voudrais correspondre à "apple", "banane", et "", respectivement. Notez que je ne veux plus jamais capture le trait d'union, mais je veux toujours match il. Si la chaîne n'est pas de la forme 123-...456
comme décrit ci-dessus, alors 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 permet d'anticipation, lookbehind, lookaround, et non de capturer les groupes.
L'observation essentielle ici est que lorsque vous avez "apple" ou "banane", vous doit également avoir de fin du trait d'union, mais vous ne voulez pas pour le match. Et quand vous êtes correspondant à la chaîne vide, vous ne doit pas avoir de fin du trait d'union. Une regex qui encapsule cette affirmation sera la bonne, je pense.
- Vous voulez correspondre à tout, sauf pour les traits d'union?
Vous devez vous connecter pour publier un commentaire.
Le seul moyen de ne pas saisir quelque chose est à l'aide de regardez autour affirmations:
Parce que même avec non-capture de groupes de
(?:...)
l'ensemble de l'expression régulière capte leurs appariés contenu. Mais cette expression régulière correspond à seulementapple
oubanana
si il est précédé par123-
et suivie par-456
, ou elle correspond à la chaîne vide si il est précédé par123-
et suivie par456
.Mise à jour: Grâce à Germán Rodríguez Herrera!
En javascript essayer:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Rappelez-vous que le résultat est dans le groupe 1
Debuggex Démo
Essayer:
Qui correspondent à
apple
,banana
, ou une chaîne vide, et à la suite il y aura un 0 ou un 1 des traits d'union. J'ai eu tort de ne pas avoir besoin d'une capture d'un groupe. Je suis bête.'123--456'
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.Essayez ceci:
apple
oubanana
ou "". Toutes les autres valeurs ne sont pas valides, comme je l'ai dit.De loin la plus simple (pour python) est
'123-(apple|banana)-?456'
.123-apple456
de sorte qu'il n'est pas correct.