给出类似@ 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。
答案 0 :(得分:1)
请注意,当重复的@ 2 =的值以之前捕获的值开头时,您当前的正则表达式将匹配。您需要在否定的前行(?!\1@)
中添加@。
要根据需要修复模式,您需要添加ABC@
作为此超前行为的替代方法:(?!\1@|ABC@)
。现在,如果整个@2
的值是ABC
或与之前捕获到组1中的值相同,它将使否定超前检查失败(因此将允许进行匹配)。
您可以使用
^(?:(?!@2=[^@]*@3=B3(?:[@>]|$)).)*@2=([^@]*)@3=B3(?:[@>]|$)(?!.*@2=(?!\1@|ABC@)[^@]*@3=B3(?:[@>]|$))
请参见regex demo。