2013-09-05 21 views
11

Sto usando questo regex:Regex gruppo opzionale

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

per abbinare le stringhe in questo modo:

SH_6208069141055_BC000388_20110412101855 

separazione in 4 gruppi:

SH 
6208069141055 
BC000388 
20110412101855 

Domanda: Come fare Rendo facoltativo il primo gruppo, in modo che il gruppo risultante sia una stringa vuota?
Voglio ottenere 4 gruppi in ogni caso, quando possibile.

stringa di input per questo caso: (nessuna sottolineatura dopo il primo gruppo)

6208069141055_BC000388_20110412101855 

risposta

10

Si può facilmente semplificare la regex essere questo:

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

non sono sicuro se l'ingresso stringa senza il primo gruppo avrà il carattere di sottolineatura o no, ma è possibile utilizzare la regex sopra se è tutta la stringa.

regex101 demo

Come si può vedere, il gruppo ha trovato 1 nel secondo match è vuota e comincia a gruppo abbinato 2.