在负前瞻中使用 OR

Using OR in negative lookahead

给出这样的输入@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3> >@1=B1@2=B2@3=B3。我想在 @3=B3 时捕获 @2= 之后的内容,并随后验证 @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= 的值以之前捕获的值开头时,您当前的正则表达式匹配。您需要在否定前瞻中添加@,(?!@)

要根据需要修复模式,您需要添加 ABC@ 作为此先行的替代方法:(?!@|ABC@)。如果整个 @2 值是 ABC 或与之前捕获到第 1 组的值相同,它现在将无法通过否定前瞻检查(因此将允许匹配发生)。

您可以使用

^(?:(?!@2=[^@]*@3=B3(?:[@>]|$)).)*@2=([^@]*)@3=B3(?:[@>]|$)(?!.*@2=(?!@|ABC@)[^@]*@3=B3(?:[@>]|$))

参见regex demo