正则表达式组的绑定可选性而不复制强制性模式部分

Posted

技术标签:

【中文标题】正则表达式组的绑定可选性而不复制强制性模式部分【英文标题】:Tied optionality of regex groups without duplicating the obligatory pattern part 【发布时间】:2021-12-08 01:59:21 【问题描述】:

我有一个像 "(?<opening>\[)?(?<body>\w+)(?<closing>\])?" 这样的正则表达式。 这是在 .NET 中。 目前打开和关闭都是可选的和独立的。 所以问题是:是否有可能只在遇到opening 时才使closing 匹配,否则视为不匹配?

目前它匹配所有可能的变体:body[bodybody][body]。 但我的目标是匹配body[body]

附注我知道可以通过((?<opening>\[)(?<body>\w+)(?<closing>\])|(?<body>\w+)), 但我实际的<body> 模式非常大而且像这样复制它很复杂。

【问题讨论】:

php 还是 .NET?你的正则表达式是什么风格? 请注意,如果您的身体模式比这复杂得多,则可能无法做到这一点。它还取决于正则表达式的风格。对于当前的“玩具”示例,使用 PCRE,(?:(?<o>\[)|(?<!\[))\b(?<body>\w++)(?(o)(?<c>])|(?!]))could work。 @WiktorStribiżew,.NET 【参考方案1】:

对于目前的场景,可以使用

(?:(?<o>\[)|(?<!\[))\b(?<body>\w+)(?(o)(?<c>])|(?![]\w]))

请参阅.NET regex demo。 详情

(?:(?&lt;o&gt;\[)|(?&lt;!\[)) \b - 单词边界(它在这里工作,因为下一个模式部分匹配单词字符) (?&lt;body&gt;\w+) - 组“正文”:一个或多个单词字符 (?(o)(?&lt;c&gt;])|(?![]\w])) - 一个条件构造,如果组“o”堆栈不为空, (?&lt;c&gt;]) 匹配并捕获到“c”组 a ] char, | - 否则(如果组“o”不匹配) (?![]\w]) - 要求没有 ] 并且在当前位置的右侧紧跟一个单词 char。

【讨论】:

由于我的特殊需要,我对它进行了一些调整,它可以按我的意愿工作。谢谢!

以上是关于正则表达式组的绑定可选性而不复制强制性模式部分的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:如何访问一个组的多个匹配项? [复制]

带有可选匹配组的正则表达式

正则表达式验证序列

可选的正则表达式模式不产生任何价值

正则表达式匹配

如何获取正则表达式捕获组的值? [复制]