Объединение регулярного выражения с группой захвата - PullRequest
0 голосов
/ 07 сентября 2018

Учитывая строку как

@1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d

Я хочу записать, что находится между @ 3 и @ 4, а затем утверждать, что во второй части строки значение (в данном случае c) НЕ одинаково.

Для этого я придумал

@3=((?:\w|-|'|"|,|\.)+?)@4=d.+(?<=@3\=)(?!\1)(?=@4\=d)

Это захватывает @3=((?:\w|-|'|"|,|\.)+?)@4=d "c", но следующая часть ((?<=@3\=)(?!\1)(?=@4\=d)) регулярного выражения не работает должным образом. Я надеялся, что (?<=@3\=) это подтвердит "@ 3 =" (?!\1) скажет assert NOT first captured group и (?=@4\=d) подтвердит @ 4 =.

Любая помощь в объяснении, почему это не работает, будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Попробуйте этот шаблон: (?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!\1@4)\w++|\w++).

Демо

0 голосов
/ 07 сентября 2018

Почему ваш шаблон не работает? Он содержит 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 подстрока
...