Я хочу построить регулярное выражение для разбора строки, которая может иметь одну из следующих двух форм: —
Часть 1 (Часть 2 — Часть 3)
или же
Часть 1 (часть 2)
Следующее регулярное выражение соответствует первой строке и захватывает все три части
(.*)\((.*)(?:-)(.*)\)
Но я не могу импровизировать, чтобы он мог соответствовать обеим струнам. Я хочу, чтобы одно регулярное выражение соответствовало обеим строкам. Не уверен, если это вообще возможно.
Вы можете использовать
'~(.*)\((.*?)(?:-(.*))?\)~'
Увидеть regex demo
подробности
(.*)
— Группа 1: любые 0+ символов, кроме символов разрыва строки, как можно больше\(
— а (
голец(.*?)
— Группа 2: любые 0+ символов, кроме символов разрыва строки, как можно меньше (?:-(.*))?
— необязательная группа, соответствующая -
и затем захват в Группу 3 любых 0+ символов, кроме символов разрыва строки, как можно больше\)
— а )
голец.Если в скобках не может быть других скобок, кроме указанных в строке, вы можете оптимизировать шаблон так, чтобы ^([^()]*)\(([^()-]*)(?:-([^()]*))?\)$
.
Других решений пока нет …