Показать сообщение отдельно
  #29 (permalink)  
Старый 24.05.2019, 19:48
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от Malleys
Alexandroppolus, если вы рег. выр. из п. 3 /(...)(...(...)...(...)...)(...)/ преобразуете, как вы описали, то вы потеряете группу №2. Оно всё-таки должно стать так: /(...)((...)(...)(...)(...)(...))(...)/
Точно! Всё-таки придется п.3 рекурсивно обрабатывать.
Сообщение от Malleys
Из п. 4 /...(regex)+.../ лучше так: /(...)(regex)+.../, ведь зачем вам группы, которые не используются.
Не, тут другая идея.

Если обобщить пп. 1-4, то суть вот в чем: мы всегда приводим регекс к виду из п.1 - последовательность групп, после каждой из которых нет + и прочего. Но если в этом регексе какая-то из групп содержит вложенные группы, то мы матч для неё обрабатываем по тем же правилам, как всю строку, иными словами, рекурсия. А п.4 - как тот же + загнать в линейную форму.

Комплексный пример:

регекс /a(b)c(d(e))(fg)+/

после преобразования получим 3 регекса:
1) Общий /(a)(b)(c)(de)((?:fg)+)/, где обертываем тегами группы 2 (с исходным номером 1, т.е. тег <P1>), 4 (тег <P2>). Вложенные группы расформировываем или нейтрализуем как ?:, они тут не нужны.

2) Матч 4 группы при этом обрабатываем регуляркой /d(e)/g, которая превратится в /(d)(e)/ и дальше рекурсия не пойдет. Здесь группа для (е) обертывается как <P3>

3) Матч 6 группы, обрабатываем регуляркой /(fg)/g, группа (fg) обертывается как <P4>, дальше рекурсия не пойдет.


https://www.npmjs.com/package/regulex - парсилка

Последний раз редактировалось Alexandroppolus, 24.05.2019 в 20:27.
Ответить с цитированием