给出类似
的字符串 @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 =。
在解释为什么这种方法不起作用方面的任何帮助将不胜感激。
答案 0 :(得分:1)
尝试以下模式:(?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!\1@4)\w++|\w++)
。
答案 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}} .
-文字-
子字符串