web-dev-qa-db-fra.com

Groupe optionnel Regex

J'utilise cette expression régulière:

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

pour faire correspondre des chaînes comme celle-ci:

SH_6208069141055_BC000388_20110412101855

se séparant en 4 groupes:

SH
6208069141055
BC000388
20110412101855

Question: Comment puis-je rendre le premier groupe facultatif, de sorte que le groupe résultant soit une chaîne vide?
Je veux avoir 4 groupes dans chaque cas, si possible.

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

6208069141055_BC000388_20110412101855
23
joe

Vous pouvez facilement simplifier votre expression régulière pour être ceci:

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$

Je ne sais pas si la chaîne d'entrée sans le premier groupe aura le trait de soulignement ou non, mais vous pouvez utiliser l'expression régulière ci-dessus si c'est la chaîne entière.

démo regex101

Comme vous pouvez le voir, le groupe correspondant 1 dans le deuxième match est vide et commence au groupe correspondant 2.

25
Jerry