如果捕获组中捕获的模式发生更改,则正则表达式不匹配

时间:2018-10-28 18:59:41

标签: 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之后的内容,并验证@3=B3时,@2=应该包含与捕获的值相同的值。

应该匹配的模式是:

@1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3>>@1=B1@2=B2@3=B3 @1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3

不匹配的模式 @1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3>>@1=B1@2=B10@3=B3 @1=A1@2=A2@3=A3>>@1=B1@2=B2@3=B3>>@1=C1@2=C2@3=C3>>@1=B1@2=B10@3=B3>>@1=B1@2=B2@3=B3

我目前执行此操作的方式分两步进行,首先是通过使用正则表达式@2=((?:\w|-|'|""|,|\.)+?)@3=B3.+@2=(?!\1@)((?:\w|-|'|""|,|\.)+?)@3=B3获取所有无效模式,然后从所有可用输入中删除这些模式。

1 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

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

Online demo.

它如何工作?

首先,它会使用tempered greedy token跳过所有文本,直到第一个@2=,然后是@3=B3

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

然后捕获@2=的值:

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

最后,它使用否定的超前断言来确保没有其他@2=后跟@3=B3的值与捕获的值不同:

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