Почему ваш шаблон не работает? Он содержит 3 раунда подряд в конце: (?<=@3\=)(?!\1)(?=@4\=d)
. Lookarounds являются утверждениями нулевой ширины и выполняются один за другим, а индекс регулярного выражения остается в том же месте, что и раньше Таким образом, (?<=@3\=)(?!\1)(?=@4\=d)
соответствует месту, которому непосредственно предшествуют @3=
и , за которым сразу следует @4=
, в то время как @4=
не может начинаться со значения в группе 1. Это не соответствует новому значению между разделителями, и не имеет особого смысла в конце.
Вы можете использовать следующий шаблон:
@3=([\w'",.-]*)@4=d.*?>>.*?@3=(?!\1@)[\w'",.-]*@4=d
См. Демонстрационную версию regex . При использовании против строки @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d
регулярное выражение сопоставляет и захватывает c
, поскольку оно не равно подстроке c1
, сопоставленной со второй [\w'",.-]*
.
Детали
@3=
- подстрока @3=
([\w'",.-]*)
- Группа 1: ноль или более символов, представляющих собой буквы, цифры, _
, '
, "
, ,
, .
или -
@4=d
- буквальная @4=d
подстрока
.*?
- любые 0+ символов, кроме символов разрыва строки, как можно меньше
>>
- подстрока >>
.*?
- любые 0+ символов, кроме символов разрыва строки, как можно меньше
@3=
- подстрока @3=
(?!\1@)
- отрицательный прогноз, который не соответствует совпадению, если текст непосредственно справа от текущего местоположения равен тексту, захваченному в группе 1, и сопровождается @
[\w'",.-]*
- ноль или более символов, представляющих собой буквы, цифры, _
, '
, "
, ,
, .
или -
@4=d
- литерал @4=d
подстрока