正则表达式非捕获组正在考虑捕获

问题描述 投票:0回答:1

我有这个正则表达式语句:

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

我希望它跳过

.*?\[Pipeline\]
\[[\d-]+T[\d:.]+Z\]
(如果存在),然后找到后面的括号。

以下示例应该匹配:

  • 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。

前向或后向似乎(也许我错了?)不可行,因为

.*?\[Pipeline\]
的长度是可变的。

regex regex-group regex-greedy
1个回答
0
投票

负前瞻应该有效。 Lookbehind 必须是固定长度的,但 Lookahead 可以是可变长度的。因此,您可以在

\[
之后在否定前瞻中放置替代方案。

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

演示

© www.soinside.com 2019 - 2024. All rights reserved.