我有这个正则表达式语句:
&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 ]]
这个不应该匹配,但它确实匹配:
&logline=[2023-09-28T19:45:09.827Z] Removing yocto/poky/scripts/lib/
因为非捕获组是可选的
(?:...)?
测试用例 1b 挖掘该部分的括号。如果我要求非捕获组,我可以排除测试用例 1b (?:...)
,但这也排除了我不想要的测试用例 4a。
前向或后向似乎(也许我错了?)不可行,因为
.*?\[Pipeline\]
的长度是可变的。
负前瞻应该有效。 Lookbehind 必须是固定长度的,但 Lookahead 可以是可变长度的。因此,您可以在
\[
之后在否定前瞻中放置替代方案。
&logline=.*?\[(?!Pipeline\]|[\d-]+T[\d:.]+Z\])