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

将多个look around regex与一个捕获组相结合

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

    @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d

    我想捕获@3和@4之间的内容,然后断言字符串的第二部分中的值(本例中的c)不相同。

    为此,我想出了

    @3=((?:\w|-|'|"|,|\.)+?)@4=d.+(?<=@3\=)(?!\1)(?=@4\=d)

    这捕获了 @3=((?:\w|-|'|"|,|\.)+?)@4=d (?<=@3\=)(?!\1)(?=@4\=d) )正则表达式的属性不能按预期工作。我希望 (?<=@3\=) 这将断言“@3=” (?!\1) 会说断言 NOT first captured group (?=@4\=d) 将断言@4=。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Wiktor Stribiżew    7 年前

    为什么你的模式不起作用?它的末尾包含3个环视框: (?<=@3\=)(?!\1)(?=@4\=d) . Lookarounds是零宽度断言,并且在regex索引与之前保持在同一位置的情况下一个接一个地执行。也就是说, (?<=@3个\=)(?!\1)(?=@4\=d) @3= 紧接着 @4= 虽然 @4= 不能以组1中的值开头。它与分隔符之间的新值不匹配,最终也没有多大意义。

    @3=([\w'",.-]*)@4=d.*?>>.*?@3=(?!\1@)[\w'",.-]*@4=d
    

    看到了吗 regex demo . 当用于 @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d 字符串,正则表达式匹配并捕获 c c1 与第二个匹配的子串 [\w'",.-]* .

    细节

    • @3= @3=
    • ([\w'",.-]*) -第1组:零个或多个字符,即字母、数字、, _ , ' , " , , , . -
    • @4=d @4=d 子串
    • .*? -除换行符以外的任何0+字符尽可能少
    • >> >> 子串
    • .*? -除换行符以外的任何0+字符尽可能少
    • -a @3=
    • (?!\1@) -如果当前位置右侧的文本与组1中捕获的文本相等并后跟 @
    • [\w'',.-]* , ' , " , , -
    • @4=d @4=d 子串
        2
  •  1
  •   Michał Turczyn    7 年前

    (?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!\1@4)\w++|\w++) .

    Demo