将正则表达式的多个外观与捕获组相结合

问题描述 投票:1回答:2

给出一个字符串

@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)会说断言NOT first captured group(?=@4\=d)将断言@ 4 =。

任何帮助解释为什么这不起作用将不胜感激。

regex pcre regex-lookarounds
2个回答
0
投票

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

您可以使用以下模式:

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

regex demo。当用于对抗@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子串

1
投票

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

Demo

© www.soinside.com 2019 - 2024. All rights reserved.