Pull to refresh

Рекурсия в регулярных выражениях

Reading time 1 min
Views 10K
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)/
Tags:
Hubs:
+16
Comments 23
Comments Comments 23

Articles