将正则表达式周围的多个外观与捕获组结合起来

时间:2018-09-07 08:39:13

标签: regex pcre regex-lookarounds

给出类似

的字符串

@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 =。

在解释为什么这种方法不起作用方面的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

Demo

答案 1 :(得分:0)

为什么您的模式不起作用?最后包含3个环视:(?<=@3\=)(?!\1)(?=@4\=d)。环视是零宽度的断言,并与正则表达式索引保持在以前相同的位置,一个接一个地执行。也就是说,(?<=@3\=)(?!\1)(?=@4\=d)匹配一个位置,该位置紧跟@3= 之前,紧跟@4=之后,而@4=不能以Group中的值开头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组:零个或多个字符,即字母,数字,_'",,{{1} }或.
  • --文字@4=d子字符串
  • @4=d-除换行符以外的任何0+个字符都应尽可能少
  • .*?-一个>>子字符串
  • >>-除换行符以外的任何0+个字符都应尽可能少
  • .*?-一个@3=子字符串
  • @3=-如果当前位置右边的文本与第1组中捕获的文本相等,并且后跟(?!\1@)
  • ,则负匹配将使匹配失败
  • @-零个或多个字符,它们是字母,数字,[\w'",.-]*_'",或{ {1}}
  • .-文字-子字符串