118 votes

Groupe optionnel Regex

J'utilise cette regex :

((?:[a-z][a-z]+))_(\d+)_((?:[a-z][a-z]+)\d+)_(\d{13})

pour correspondre à des chaînes de caractères comme celle-ci :

SH_6208069141055_BC000388_20110412101855

en se séparant en 4 groupes :

SH
6208069141055
BC000388
20110412101855

Question : Comment rendre le premier groupe facultatif, de sorte que le groupe résultant soit une chaîne vide ?
Je veux obtenir 4 groupes dans tous les cas, si possible.

Chaîne d'entrée pour ce cas : (pas de soulignement après le premier groupe)

6208069141055_BC000388_20110412101855

212voto

DanFromGermany Points 7201

Pour créer un groupe de correspondance non capturant, de zéro à plus, vous devez ajouter ? .

(?: ..... )?
^          ^____ optional
|____ group

97voto

Jerry Points 40870

Vous pouvez facilement simplifier votre regex pour être ceci :

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$
^              ^^
|--------------||
| first group  ||- quantifier for 0 or 1 time (essentially making it optional) 

Je ne suis pas sûr que la chaîne d'entrée sans le premier groupe aura l'underscore ou non, mais vous pouvez utiliser la regex ci-dessus si c'est la chaîne entière.

Démonstration de regex101

Comme vous pouvez le voir, le groupe apparié 1 dans la deuxième correspondance est vide et commence au groupe apparié 2.

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