首页 > 解决方案 > 正则表达式 - 捕获多行模式 - 最短匹配

问题描述

我在 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

解决方案


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

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

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

模式匹配:

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

查看正则表达式演示


推荐阅读