Ваше первое регулярное выражение может быть уменьшено до ^(?:\([^()]+\)|[^()]+)$
. Когда вы использовали его в lookahead, вы не привязывали его в конце, вы не использовали $
. Таким образом, прямое «быстрое исправление» будет выглядеть следующим образом:
^(?=(?:\([^()]+\)|[^()]+)$)\(?[a-z]+\)?$
См. Демонстрационный пример регулярных выражений .
Второе регулярное выражение также можно записать как простое ^(?:\([a-z]+\)|[a-z]+)$
,с двумя альтернативами, которые либо соответствуют строчной букве в скобках, либо без них.
В .NET вы также можете использовать
^(\()?[a-z]+(?(1)\))$
См. demo .
Подробности
^
- начало строки (\()?
- необязательное сопоставление группы захвата # 1a (
[a-z]+
- 1+ строчные буквы (\p{Ll}+
соответствует любым строчным буквам Unicode) (?(1)\))
- условная конструкция: если сопоставлена группа 1 (если былаоткрытая скобка) match )
$
- конец строки.