【问题标题】:Why my optional captured group in my regex does not work?为什么我的正则表达式中的可选捕获组不起作用?
【发布时间】:2021-01-27 17:28:30
【问题描述】:

这是我通常会得到的文本示例:

CERTIFICATION/repos_1/test_examples_1_01_C.py::test_case[6]

CERTIFICATION/repos_1/test_examples_2_01_C.py::test_case[7]

INTEGRATION/test_example_scan_1.py::test_case

INTEGRATION/test_example_scan_2.py::test_case

这是我用来捕获 3 个不同组的正则表达式:

^.*\/(.*)\.py.*:{2}(.*(\[.*\])?)

如果我们以我示例的第一行为例,我应该得到:

test_examples_1_BV_01_C - test_case[6] - [6]

最后一行:

test_example_scan_2 - test_case - 无

但是如果您尝试这个正则表达式,您会发现第一个示例不起作用。我无法得到 [6]。如果删除“?”您将无法匹配末尾没有“[.*]”的行

那么,我怎样才能获得所有这些信息?我做错了什么?

问候

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

    你可以使用

    ^.*\/(.*)\.py.*::(.*?(\[.*?\])?)$
    

    regex demo

    详情

    • ^ - 字符串开头
    • .* - 除换行符之外的任何零个或多个字符,尽可能多
    • \/ - 一个 / 字符
    • (.*) - 第 1 组:除换行符之外的任何零个或多个字符,尽可能多
    • \.py - .py 子字符串
    • .* - 除换行符之外的任何零个或多个字符,尽可能多
    • :: - :: 字符串
    • (.*?(\[.*?\])?) - 第 2 组:除换行符之外的任何零个或多个字符,尽可能少,然后是与 [ 匹配的可选第 3 组,除换行符之外的任何零个或多个字符,尽可能少,和]
    • $ - 字符串结束。

    【讨论】:

    • 感谢您的回答。这是完美的,我完全理解我错过了什么。我唯一改变的是这里([.*?])。我删除了“?”因为它不应该是可选的
    • @CyDevos .*? 并不意味着可选,它意味着任何零个或多个字符*但尽可能少。如果您使用.*,它将匹配尽可能多的
    • 哦,好吧! “*但尽可能少”这真的很有趣。谢谢
    【解决方案2】:

    在否定字符类的帮助下,您可以获得所有匹配项并使这个正则表达式更加高效

    ^.*/([^.]+)\.py::([^[]+(\[[^]]*]|))$
    

    RegEx Demo

    【讨论】:

    • 感谢您的回答。我测试了它并且它有效。我选择将这个其他答案视为已接受,因为它更接近我所做的。还是你的回答很好
    猜你喜欢
    • 2011-02-11
    • 2012-11-17
    • 1970-01-01
    • 2022-11-21
    • 2012-10-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多