给出一个字符串
@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 =。
任何帮助解释为什么这不起作用将不胜感激。
你的模式为什么不起作用?它包含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
子串尝试这种模式:(?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!\1@4)\w++|\w++)
。