Сообщение от Aetae
|
бери да пользуйся.
|
Спасибо, но там выделяет не именно те матчи которые совпали, а идет реплейс
^(.*?)match1(.*?)match2(.*?)match3(.*?)$
на
$1<span class="group-1">match1</span>$2<span class="group-2">match2</span>$3<span class="group-3">match3</span>$4
соответственно это не точные позиции матчей.
Я примерно такое-же делал, только я сдвигал позицию под каждое совпадение, чтобы они были последовательно подсвечены.
Если ввести там регексп из моего первого сообщения то на выходе будет
xxab
aaaa
aaaa
bbbb
baxt
ну и группа в группе тоже сдвинет весь результат
(aaa(a))\na(a)aa\nbb(b)
xxab
aaaa
aaaa
bbbb
baxt
nerv_ заменяется ведь все вхождение регексп, вот если бы только подгруппы можно было заменить.
мысль только распарсить регулярку поочередно закрывая все группы (?
кроме одной и по бокам этой группы заключать в скобки части регулярки.
допустим имеем
(aaa(a))\na(a)*aa\nbb(b)
преобразуем
(aaa(?:a))(\na(?:a)*aa\nbb(?:b)) т.к. первая группа начинается с самого вхождения, то выйдет всего 2 группы, тоже самое если мы работаем с последней группой и регексп заканчивается ей
получаем
aaaa
и
aaaa
bbbb
получаем начальную позицию длина pos=матч1+index
высчитываем позицию окончания
poslast=матч0-(матч1+матч3), тем самым мы высчитаем длину матча (a)* - когда группа повторяется или poslast=длинна совпадения+матч0-(матч1+матч2+матч3) в зависимости от того будем мы захватывать *?+ и т.д. после группы те. будет у нас так (a)* или мы преобразуем группу в ((?:a)*)
итого на выходе мы будем иметь позицию и длину вхождения
второе преобразование соответственно такое
(?
aaa)(a))(\na(?:a)*aa\nbb(?:b))
((?:aaa(?:a))\na)(a)*(aa\nbb(?:b))
и т.д.
сложность в том, что нужно будет распаршивать регулярку по группам и закрывать группы. Кода возможно и не так много получится, но придется поломать голову над точным вычленением каждой подгруппы и позиций для образования новых подгрупп.
поправлюсь, количество новых групп не будет ограничено от 2 до 3, а будет расширятся если у нас подгруппа для которой мы находим позицию находится в другой подгруппе (-ах) т.е s(aaa(a)s)x - получится нужно проставить еще 4 подгруппы (s)(?
aaa)(a)(s))(x) и чем больше вложений тем больше подгрупп будет
В общем изврат)) Возможно кому-то пригодится для дальнейших раздумий, но писать такой велосипед...