Шаблон вашей группы e
не выполняет нужную работу, в настоящее время он сопоставляет скобки с 1 уровнем глубины, поскольку вы только один раз повторили шаблон e
. Ему нужно сопоставить столько (...)
подстрок, сколько имеется, и, таким образом, шаблон подпрограммы должен находиться внутри *
или +
количественной группы, и его даже можно «упростить» до (?<e>[^()]*(?:\((?&e)\)[^()]*)*)
.
Обратите внимание, что ваша группа e
равна (?<e>[^()]+|\((?&e)\))*
. [^()]*
вокруг \((?&e)\)
являются избыточными, поскольку альтернатива [^()]+
будет использовать символы, отличные от (
и )
на текущем уровне глубины.
Кроме того, вы количественно определили шаблон Group e
, превратив его в группу повторных захватов , в которой текст сохраняется только во время последней итерации.
Вы можете использовать
(?<name>\w+)\s*\(\K(?<e>[^()]*(?:\((?&e)\)[^()]*)*)(?=\))
См. Демонстрационную версию regex
Детали
(?<name>\w+)\s*\(\K
- 1+ слов, 0+ пробелов и (
, которые опущены в совпадении
(?<e>
- начало группы e
[^()]*
- 0+ символов кроме (
и )
(?:
- запуск группы без захвата:
\(
- (
char
(?&e)
- группа e
шаблон повторяется
\)
- )
[^()]*
- 0+ символов, отличных от (
и )
)*
- 0 или более повторений
)
- конец e
группы
(?=\))
- )
должно быть непосредственно справа от текущего местоположения.