Regex optionele groep

Ik gebruik deze regex:

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

om strings als volgt te matchen:

SH_6208069141055_BC000388_20110412101855

opsplitsen in 4 groepen:

SH
6208069141055
BC000388
20110412101855

Vraag:Hoe maak ik de eerste groep optioneel, zodat de resulterende groep een lege tekenreeks is?
Ik wil in elk geval 4 groepen krijgen, indien mogelijk.

Invoertekenreeks voor dit geval: (geen onderstreping na de eerste groep)

6208069141055_BC000388_20110412101855

Antwoord 1, autoriteit 100%

U kunt uw regex eenvoudig vereenvoudigen tot dit:

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

Ik weet niet zeker of de invoertekenreeks zonder de eerste groep het onderstrepingsteken zal hebben of niet, maar u kunt de bovenstaande regex gebruiken als het de hele tekenreeks is.

regex101-demo

Zoals je kunt zien, is de overeenkomende groep 1 in de tweede wedstrijd leeg en begint bij overeenkomende groep 2.


Antwoord 2, autoriteit 97%

Als u een niet-vastleggende, nul tot meer overeenkomende groep maakt, moet u ?toevoegen.

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

Other episodes