【问题标题】:Multi line regex match until next group is found多行正则表达式匹配,直到找到下一个组
【发布时间】:2018-04-05 18:50:29
【问题描述】:

我正在尝试匹配许可证文件中的文本,但在找到下一个匹配项时如何停止匹配任何文本时遇到了困难。

我的文字是这样的:

packagename
1.0.5 <https://github.com/user/packagename>

Lots of text
here
across multiple lines

packagename2
1.1.0 <https://github.com/user/packagename2>

lots more text here
this continues for a while
across many lines

要找到每场比赛应该从哪里开始,我使用以下正则表达式:

(\w+\n\d+\.\d+\.\d+\s&lt;.*&gt;)

这正确匹配了我所有的标题,但是当我尝试使用时:

(\w+\n\d+\.\d+\.\d+\s&lt;.*&gt;)((.|\n)*)

为了匹配后面的所有字符和换行符,它只捕获第一组,然后只捕获后面的所有文本。

我想将包名作为一个组匹配,并将下一个包名之前的所有内容作为第二组匹配。

【问题讨论】:

标签: regex


【解决方案1】:

你可以使用

(?m)^(\w+\n\d+(?:\.\d+){2}\s+<.*>)([\s\S]*?)(?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s<|\Z)

在 Python 中,

results = re.findall(r'^(\w+\n\d+(?:\.\d+){2}\s+<.*>)([\s\S]*?)(?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s<|\Z)', re.M)

regex demo

详情

  • ^ - 行的开头(由于 re.M 修饰符,^ 匹配行开头以及字符串的开头)
  • (\w+\n\d+(?:\.\d+){2}\s+&lt;.*&gt;) - 第 1 组:
    • \w+ - 1+ 个单词字符
    • \n - 换行
    • \d+ - 1 位以上
    • (?:\.\d+){2} - 重复 2 次 . 和 1+ 位
    • \s+ - 1+ 个空格
    • &lt;.*&gt; - &lt;,除换行符之外的 0+ 个字符尽可能多,&gt;
  • ([\s\S]*?) - 第 2 组:任何 0+ 个字符,尽可能少,直到最左边出现...
  • (?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s&lt;|\Z) - 一个积极的前瞻,匹配而不增加匹配值
    • [\n\r]+ - 1+ 换行符后跟
    • \w+\n\d+(?:\.\d+){2}\s&lt; - 第 1 组模式(几乎全部,你可以在这里全部添加,但似乎到 &lt; 就足够了)
  • | - 或
  • \Z - 字符串的结尾。

【讨论】:

  • 如果该模式有任何问题,请告知OP confirmed,此解决方案“完美”运行。
猜你喜欢
  • 2021-10-22
  • 2012-05-09
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2023-03-13
  • 2014-08-22
相关资源
最近更新 更多