Размышления, для общего случая:
Придется вручную парсить регулярку, чтобы понять её структуру и при необходимости что-то в ней поменять.
1) Элементарный случай, линейная регулярка только из групп: /(...)(...)(...)/ - , оставляем как есть, замена по паттерну "<P1>$1</P1><P2>$2</P2><P3>$3</P3>"
2) Линейная регулярка с подстроками вне групп: /(...)...(...)/ - все необернутое оборачиваем в группы, получив /(...)(...)(...)/, замена по паттерну "<P1>$1</P1>$2<P2>$3</P2>", тут для $2 никаких тегов не добавлено, потому что это не было группой, а для $3 указаны теги P2, это была 2 группа изначально. Т.е. понадобится таблица соответствий, ибо номера групп сдвигаются.
3) Вложенные группы. /(...)(...(...)...(...)...)(...)/ - если нет ничего из п.4, то вторую группу можно просто растянуть в линейную по мотивам п.2: /(...)(...)(...)(...)(...)(...)(...)/, опять же с таблицей соответствий сдвинувшихся номеров.
4) Звездочки, плюсики, знаки вопроса, фигурные скобки. /...(regex)+.../ - делаем так: /(...)((?:regex)+)(...)/, в методе replace второй параметр - функция, и в ней матч для второй группы отдельно реплейсим регуляркой /regex/g, по тем же правилам, т.е. будет рекурсия.
При составлении таблицы соответствий из п.2 не забыть про обратные ссылки в регулярке (\1, \2 и т.д.), их тоже поправить.
Что делать с lookahead в п.4, пока не совсем понятно.
Последний раз редактировалось Alexandroppolus, 24.05.2019 в 18:51.
|