Regex非捕获组正在考虑捕获

dl5txlt9  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我有一个regex语句:

&logline=(?:.*?\[Pipeline\]|\[[\d-]+T[\d:.]+Z\])?.*?(\[)

我希望它跳过.*?\[Pipeline\]\[[\d-]+T[\d:.]+Z\](如果它们存在的话),然后找到后面的a括号。
下面的例子应该匹配:

  • acs&logline=fsdafdsadsdsafdsa sdfs[Pipeline] ++ '[' lucky = as5712 ']'
  • ad&logline= Running on [4AZZVKFkf9ZNK6cEWbpgcClefWPKmoijZvh1OAAA=Docker2_lw in /ws/test_v3_2 :
  • &logline=[2023-09-28T19:39:25.868Z] ++ [[ 1 == \1 ]]
  • afdadsds&logline=[2023-09-28T19:39:25.868Z] ++ [[ ceed_test_runner == \J\O\B\P\O\O\L_\E\N\D_\O\F_\J\O\B\S ]]

这一个不应该匹配,但它确实:

  1. B &logline=[2023-09-28T19:45:09.827Z] Removing yocto/poky/scripts/lib/
    由于非捕获组是可选的,(?:...)?测试用例1b挖掘该部分的括号。如果我把非捕获组设置为(?:...),我可以排除测试用例1b,但这也排除了我不想要的测试用例4a。
    Lookaheads或lookbehinds似乎(也许我错了?),因为.*?\[Pipeline\]是可变长度的。
mtb9vblg

mtb9vblg1#

消极的前瞻应该起作用。Lookbehind必须是固定长度的,但Lookahead可以是可变长度的。因此,您可以在\[之后放置一个负向前查找的替代项。

&logline=.*?\[(?!Pipeline\]|[\d-]+T[\d:.]+Z\])

DEMO

相关问题