Нужна помощь в построении регулярного выражения для принятия двух форм строк

Я хочу построить регулярное выражение для разбора строки, которая может иметь одну из следующих двух форм: —

Часть 1 (Часть 2 — Часть 3)

или же

Часть 1 (часть 2)

Следующее регулярное выражение соответствует первой строке и захватывает все три части

(.*)\((.*)(?:-)(.*)\)

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

1

Решение

Вы можете использовать

'~(.*)\((.*?)(?:-(.*))?\)~'

Увидеть regex demo

подробности

  • (.*) — Группа 1: любые 0+ символов, кроме символов разрыва строки, как можно больше
  • \( — а ( голец
  • (.*?) — Группа 2: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?:-(.*))? — необязательная группа, соответствующая - и затем захват в Группу 3 любых 0+ символов, кроме символов разрыва строки, как можно больше
  • \) — а ) голец.

Если в скобках не может быть других скобок, кроме указанных в строке, вы можете оптимизировать шаблон так, чтобы ^([^()]*)\(([^()-]*)(?:-([^()]*))?\)$.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]