将多个环顾正则表达式与捕获组相结合

Combining multiple look around regex with a capturing group

给定一个像

这样的字符串

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

我想捕获@3 和@4 之间的内容,然后断言字符串的第二部分中的值(在本例中为c)不相同。

为此,我想到了

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

这捕获了 @3=((?:\w|-|'|"|,|\.)+?)@4=d "c" 但正则表达式的下一部分 ((?<=@3\=)(?!)(?=@4\=d)) 没有按预期工作。我希望 (?<=@3\=) 这会断言“@3=” (?!) 会说断言 NOT first captured group(?=@4\=d) 会断言 @4=。

如果您能帮助解释为什么这不起作用,我们将不胜感激。

为什么你的模式不起作用?它最后包含 3 个 lookarounds:(?<=@3\=)(?!)(?=@4\=d)。 Lookarounds 是零宽度断言,一个接一个地执行,正则表达式索引保持在与以前相同的位置。也就是说,(?<=@3\=)(?!)(?=@4\=d) 匹配紧跟在 @3= 之前的位置 和紧跟在 @4= 之后的 @4= 不能以组 1 中的值。它与分隔符之间的新值不匹配,最终没有多大意义。

您可以使用以下模式:

@3=([\w'",.-]*)@4=d.*?>>.*?@3=(?!@)[\w'",.-]*@4=d

regex demo。当用于 @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d 字符串时,正则表达式匹配并捕获 c,因为它不等于与第二个 [\w'",.-]*.

匹配的 c1 子字符串

详情

  • @3= - @3= 子串
  • ([\w'",.-]*) - 第 1 组:零个或多个字母、数字、_'",.-
  • @4=d - 文字 @4=d 子串
  • .*? - 除换行字符外的任何 0+ 个字符尽可能少
  • >> - >> 子串
  • .*? - 除换行字符外的任何 0+ 个字符尽可能少
  • @3= - @3= 子串
  • (?!@) - 如果当前位置右侧的文本等于第 1 组中捕获的文本并且后跟 @[=72,则匹配失败的否定前瞻=]
  • [\w'",.-]* - 零个或多个字母、数字、_'",.-
  • @4=d - 文字 @4=d 子串

试试这个模式:(?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!@4)\w++|\w++).

Demo