【问题标题】:Regex - Capture multiline pattern - the shortest match正则表达式 - 捕获多行模式 - 最短匹配
【发布时间】:2021-10-15 00:55:42
【问题描述】:

My test result in regexr dot com

我正在尝试捕获多行文本中的最短匹配,并在找到整个模式之前停止检查开始模式是否再次出现。

有问题的模式:

    test2(.|\n)*?test4

输入:

    1       test1
    2       test2
    5       test5
    6       test1
    7       test2
    8       test3
    9       test4
    10      test5
    11      test1
    12      test2
    13      test3
    14      test4
    15      test5

预期 2 个结果:
第一:第 7 行到第 9 行
第二:第 12 行到第 14 行

实际(不需要的)结果:
第一:第 2 行到第 9 行
第二:第 12 行到第 14 行

【问题讨论】:

    标签: regex


    【解决方案1】:

    (.|\n)*? 是非贪婪的,但它也可以匹配任何字符,包括任何形式的测试字符串。

    您可以做的是通过只允许数字 2、3 或 4 来限制接受的 test 字符串,并使非捕获组不贪婪地获得“最短”匹配。

    test2(?:\n.*test[234])*?\n.*test4
    

    模式匹配:

    • test2 匹配字面意思
    • (?:非捕获组整体重复
      • \n.*test[234] 匹配换行符并在 test 行中后跟数字 2、3 或 4
    • )*?关闭非捕获组,可选重复非贪婪
    • \n.*test4匹配换行符和匹配test4的行

    查看regex demo

    【讨论】:

    • 看来我的测试样本不好。这是实际数据。请参阅:link
      level=Info(?:(.|\n)*?(^level=|sec"$)) “未选择”的是我想要捕获的实际数据。来自 level=Info,以 sec"
      结束
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多