如何进行多行匹配,其中后续的某些匹配是可选的?
模式:
(?<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>命名分组oneOne字面量匹配(?:\n(?!(?:Two|Three)$).*)*匹配一个换行符,随后匹配整行,只要这一行不以可选头部开头)结束分组1(?:\n(?<two>Two(?:\n(?!Three$).*)*))?第二组同理,但随后是可选(?:\n(?<hree>Three(?:\n.*)*))?第三组同理,也可选
请参考一个 regex101演示。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。