str = "a * ((b-c)/(d-e) - f) * g"
reg = /(?
\(
(?:
(?>
\\[()]
|
[^()]
)
|
\g
)*
\)
)
\x
m=reg.match(str).to_a
Что делает этот код под катом.
Данный код находит любое вложенное выражение с правильно раставленными скобками.
reg = /(? # Начало именнованого выражения
\( # Открывающая круглая скобка
(?: # Незапоминаемая группа
(?> # Сопоставление с собственическим выражением
\\[()] #экранированная скобка
| # ЛИБО
[^()]# вообще не скобка
) #Конец собственического выражения
| # ЛИБО
\g # Вложенная группа в скобках (рекурсивынй вызов)
)* # Незапоминаеммаяя группа
\) # Закрывающая круглая скобка
) #конеч выражения
\x#
m=reg.match(str).to_a # [«a ((b-c)/(d-e) — f)». " a ((b-c)/(d-e) — f)"]
Нужно не забывать что левосторонняя риекурсия запрещена
Что можно делать.
str = "bbbaccc"
rel = /(? a|b\g c)/
re1.match(str).to_a
А так нельзя.
re2 = /(? a|\g c)/