Показать сообщение отдельно
  #17 (permalink)  
Старый 07.04.2013, 02:16
Аспирант
Отправить личное сообщение для edison Посмотреть профиль Найти все сообщения от edison
 
Регистрация: 01.04.2013
Сообщений: 58

Сообщение от 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) и чем больше вложений тем больше подгрупп будет

В общем изврат)) Возможно кому-то пригодится для дальнейших раздумий, но писать такой велосипед...
Ответить с цитированием