在不复制强制性模式部分的情况下绑定正则表达式组的可选性
Tied optionality of regex groups without duplicating the obligatory pattern part
我有一个像 "(?<opening>\[)?(?<body>\w+)(?<closing>\])?"
这样的正则表达式。
这是在 .NET 中。
目前打开和关闭都是可选的和独立的。
所以问题是:是否只有遇到 opening
才能使 closing
匹配,否则视为不匹配?
目前它匹配所有可能的变体:body
、[body
、body]
、[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。
我有一个像 "(?<opening>\[)?(?<body>\w+)(?<closing>\])?"
这样的正则表达式。
这是在 .NET 中。
目前打开和关闭都是可选的和独立的。
所以问题是:是否只有遇到 opening
才能使 closing
匹配,否则视为不匹配?
目前它匹配所有可能的变体:body
、[body
、body]
、[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。