在不复制强制性模式部分的情况下绑定正则表达式组的可选性

Tied optionality of regex groups without duplicating the obligatory pattern part

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

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

P.S。我知道可以通过 ((?<opening>\[)(?<body>\w+)(?<closing>\])|(?<body>\w+)),
但是我的实际 <body> 模式非常大,要像那样复制它也很复杂。

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

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

.NET regex demo详情:

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