如何进行多行匹配,其中后续的某些匹配是可选的?

编程语言 2026-07-09

模式:

(?<one>One[\w\W]+)(?<optional_two>Two[\w\W]+)(?<optional_three>Three[\w\W]+)

测试用例:

One
...
...
...
Two
...
...
...
Three
...
...
...

https://regex101.com/r/FOgBMg/1

但如果第二部分或第三部分缺失,则整个匹配会失败。

如果我尝试用 ? 将第二部分或第三部分设为可选,那么第一部分会把它们吞掉。

(?<one>One[\w\W]+)(?<optional_two>Two[\w\W]+)?(?<optional_three>Three[\w\W]+)?

如何让第二部分和第三部分成为可选的,同时又不被第一部分吞掉?

解决方案

对于你示例中的这三部分,你可以先匹配标题,随后跟着一些可选的行,这些行的开头不能以可选的第二个标题或第三个标题开头。

然后对第二部分和第三部分重复同样的做法,并使它们都可选。

^(?<one>One(?:\n(?!(?:Two|Three)$).*)*)(?:\n(?<two>Two(?:\n(?!Three$).*)*))?(?:\n(?<hree>Three(?:\n.*)*))?

正则表达式的匹配如下:

  • ^ 字符串起始处,或使用单词边界 \b
  • (?<one> 命名分组 one
  • One 字面量匹配
  • (?:\n(?!(?:Two|Three)$).*)* 匹配一个换行符,随后匹配整行,只要这一行不以可选头部开头
  • ) 结束分组1
  • (?:\n(?<two>Two(?:\n(?!Three$).*)*))? 第二组同理,但随后是可选
  • (?:\n(?<hree>Three(?:\n.*)*))? 第三组同理,也可选

请参考一个 regex101演示

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章