代码之家  ›  专栏  ›  技术社区  ›  mohit

用于在捕获组中捕获的模式更改时不匹配的正则表达式

  •  2
  • mohit  · 技术社区  · 7 年前

    如果输入像 @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 ,那么

    应匹配的模式有:

    @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

    目前我做这件事的方法有两种,第一种是使用regex获取所有无效的模式 @2=((?:\w|-|'|""|,|\.)+?)@3=B3.+@2=(?!\1@)((?:\w|-|'|""|,|\.)+?)@3=B3 然后从所有可用的输入中删除这些模式。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Aran-Fey Kevin    7 年前

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

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

    Online demo.

    它是如何工作的?

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

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

    然后它捕获 @2=

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

    最后,它使用一个否定的前瞻断言来确保 @2= @3=B3 与捕获的值不同:

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