Как стать автором
Обновить

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

Время на прочтение1 мин
Количество просмотров11K
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)/
Теги:
Хабы:
Всего голосов 38: ↑27 и ↓11+16
Комментарии23

Публикации

Истории

Работа

Программист Ruby
4 вакансии
Ruby on Rails
4 вакансии

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань