Необязательная группа регулярных выражений

Я использую это регулярное выражение:

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

чтобы соответствовать таким строкам:

SH_6208069141055_BC000388_20110412101855

разделившись на 4 группы:

SH
6208069141055
BC000388
20110412101855

Вопрос: Как сделать первую группу необязательной, чтобы результирующая группа представляла собой пустую строку?
Я хочу, чтобы в каждом случае было по 4 группы, когда это возможно.

Строка ввода для этого случая: (без подчеркивания после первой группы)

6208069141055_BC000388_20110412101855

person joe    schedule 05.09.2013    source источник


Ответы (2)


Вы можете легко упростить свое регулярное выражение следующим образом:

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

Я не уверен, будет ли входная строка без первой группы иметь подчеркивание или нет, но вы можете использовать указанное выше регулярное выражение, если это вся строка.

regex101 demo

Как видите, соответствующая группа 1 во втором сопоставлении пуста и начинается с сопоставленной группы 2.

person Jerry    schedule 05.09.2013
comment
Спасибо! Мне было так сложно придумывать, что искать, чтобы найти этот вопрос! - person Reza S; 09.04.2019
comment
Какой из символов отмечает группу необязательной? - person Daniel W.; 18.12.2019
comment
? после первой группы? Это 17-й символ слева. - person Jerry; 18.12.2019

Чтобы создать группу без захвата, от нуля до более подходящей группы, вы должны добавить ?.

(?: ..... )?
^          ^____ optional
|____ group
person Daniel W.    schedule 18.12.2019
comment
Этот ответ более полезен просто потому, что он более эффективно помогает тем людям, которые пришли сюда через поисковые системы Regex optional group, что является темой вопроса. Никому не нужны демонстрации с внешних сайтов, всем нужен простой ответ. SO - это больше о том, чтобы помочь как можно большему количеству людей, а не о том, чтобы жаловаться на то, что внезапно у вас возникла опасность для вашего единственного идеального ответа. - person Nikolai Shalakin; 24.07.2020