Regex положительный прогноз вперед, не мешающий совпадению - PullRequest
1 голос
/ 22 октября 2019

Если это регулярное выражение :

^(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\))))$

соответствует abc и (abc), но не (abc или abc), почему я не могу использовать его в положительномпрогноз как этот ?

^(?=(?:(?:\([^\(\)]+\))|(?:(?<!\()[^\(\)]+(?!\)))))(?:\(?[a-z]+\)?)$

Это соответствует abc) например.

1 Ответ

2 голосов
/ 22 октября 2019

Ваше первое регулярное выражение может быть уменьшено до ^(?:\([^()]+\)|[^()]+)$. Когда вы использовали его в lookahead, вы не привязывали его в конце, вы не использовали $. Таким образом, прямое «быстрое исправление» будет выглядеть следующим образом:

^(?=(?:\([^()]+\)|[^()]+)$)\(?[a-z]+\)?$

См. Демонстрационный пример регулярных выражений .

Второе регулярное выражение также можно записать как простое ^(?:\([a-z]+\)|[a-z]+)$,с двумя альтернативами, которые либо соответствуют строчной букве в скобках, либо без них.

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

^(\()?[a-z]+(?(1)\))$

См. demo .

Подробности

  • ^ - начало строки
  • (\()? - необязательное сопоставление группы захвата # 1a (
  • [a-z]+ - 1+ строчные буквы (\p{Ll}+ соответствует любым строчным буквам Unicode)
  • (?(1)\)) - условная конструкция: если сопоставлена ​​группа 1 (если былаоткрытая скобка) match )
  • $ - конец строки.
...