给定一个类似@1的输入=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3>>@1=B1@2=B2@3=B3。我想捕获@2=当@3=B3时之后的内容,并随后验证@2=是否应包含与捕获的值相同的值,或者该值应为"ABC">
应该匹配的模式是:
@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=B2@3=C3>>@1=B1@2=B2@3=B3
@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=B2@3=C3>>@1=B1@2=ABC@3=B3
@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=B2@3=C3
不应与@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=B2@3=C3>>@1=B1@2=B10@3=B3
匹配的模式@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=B1@2=B10@3=B3>>@1=B1@2=B2@3=B3
当它应该与整个字符串匹配时,我可以使用负环视来完成该部分。但如果字符串不匹配,我无法执行OR部分,即@2=ABC。
https://regex101.com/r/eCYCtg/1
请注意,当重复的@2=的值以之前捕获的值开头时,当前regex匹配。您需要在负前瞻(?!1@)
中添加@。
要根据需要修复模式,需要添加ABC@
作为此前瞻性的替代方案:(?!1@|ABC@)
。如果整个@2
值是ABC
或与之前在组1中捕获的值相同,则它现在将不通过负前瞻检查(从而允许匹配发生(。
您可以使用
^(?:(?!@2=[^@]*@3=B3(?:[@>]|$)).)*@2=([^@]*)@3=B3(?:[@>]|$)(?!.*@2=(?!1@|ABC@)[^@]*@3=B3(?:[@>]|$))
请参阅regex演示。