在负前瞻中使用OR

时间:2018-11-14 10:41:37

标签: regex pcre

给出类似@ 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

1 个答案:

答案 0 :(得分:1)

请注意,当重复的@ 2 =的值以之前捕获的值开头时,您当前的正则表达式将匹配。您需要在否定的前行(?!\1@)中添加@。

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

您可以使用

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

请参见regex demo