Задать вопрос
JimmiJanger
@JimmiJanger
Любопытный активист, под маской ленивого нуба.

Подсобите с регулярным выражением?

var regul = /(AAA|BBB|CCC|DDD)\(.*?\)/g;
var str = "one two 12AAA(CCC(C1_1);A1_1)dfg "+
              "dfgdfgdfg,BBB(B1_1; B1_2) sfsgndf "+
              "dfgnhjdfglkjdfg DDD(D1_1)";
var ARR = str.match( regul );

for(var i = 0; i < ARR.length; i++) {
    console.log((i+1)+') '+ARR[i]);
}


Собственно, в чём проблема ...
В моём случае. регулярное выражение выдаёт следующий результат:
1) AAA(CCC(C1_1)
2) BBB(B1_1; B1_2)
3) DDD(D1_1)

А мне нужно, что бы скрипт, выдал следующее:
1) AAA(CCC(C1_1);A1_1)
2) CCC(C1_1)
3) BBB(B1_1; B1_2)
4) DDD(D1_1)

Подскажите, можно ли используя регулярные выражения, добиться желаемого результата? Или же мне придётся делать дополнительные действия?

Суть: Мне надо написать так регулярную функцию, что бы она понимала что: CCC(), находится внутри AAA()
За помощь, буду благодарен!

Ссылка: https://jsfiddle.net/kh9h71kL/
  • Вопрос задан
  • 196 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
Очевидно, нужны рекурсивные регулярки.
https://regex101.com/r/SBqnii/7
С группами можно поиграться. Наверн, придётся пропускать регулярку по результату ещё раз, но думаю это проще и возможно даже быстрее использования конечного автомата. А на пример подобного автомата я бы посмотрел :)

Сравнение производительности с конечным автоматом:
https://jsperf.com/regex-vs-fsa/1
Ответ написан
romash
@romash
web-разработчик
Ответ не верен, но я слишком долго его писал, так что мне жалко его удалять :D
Вот так можно получить
1) AAA(CCC(C1_1);A1_1);
2) BBB(B1_1; B1_2);
3) DDD(D1_1).

Я не уверен, но, насколько мне известно, так как CCC(C1_1) уже находится в найденном (внутри AAA(CCC(C1_1);A1_1)), второй раз его вы не найдёте, для этого придётся повторять парсинг для группы 2 каждого включения.

Также в примере вы можете увидеть, что тройное вложение под это правило уже не подойдёт. Вы можете расширить регулярку для отлавливания любого конечного количества вложений, но лично я бы не советовал их использовать для подобных задач. Отмечу, что в регулярках я шарю не очень, так что возможно мой совет некорректен, в таком случае прошу прощения.

UPD: Изменил пример. Предыдущая регулярка искала AAA(bar; BBB(); foo) но путалась с AAA(BBB(); foo; DDD(); bar).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы