2013-09-05 2 views
11

J'utilise cette expression rationnelle:Regex groupe facultatif

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

pour correspondre à des chaînes comme ceci:

SH_6208069141055_BC000388_20110412101855 

séparer en 4 groupes:

SH 
6208069141055 
BC000388 
20110412101855 

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

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

6208069141055_BC000388_20110412101855 

Répondre

10

Vous pouvez facilement simplifier votre regex être ceci:

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

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

regex101 demo

Comme vous pouvez le voir, le groupe correspond à 1 dans le deuxième match est vide et commence à groupe apparié 2.

Questions connexes