在负前瞻中使用OR

  • 本文关键字:OR 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

请注意,当重复的@2=的值以之前捕获的值开头时,当前regex匹配。您需要在负前瞻(?!1@)中添加@。

要根据需要修复模式,需要添加ABC@作为此前瞻性的替代方案:(?!1@|ABC@)。如果整个@2值是ABC或与之前在组1中捕获的值相同,则它现在将不通过负前瞻检查(从而允许匹配发生(。

您可以使用

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

请参阅regex演示。

相关内容

  • 没有找到相关文章

最新更新