正则表达式 - 仅当另一个命名组匹配时命名组

Posted

技术标签:

【中文标题】正则表达式 - 仅当另一个命名组匹配时命名组【英文标题】:regex - named group only if another named group matches 【发布时间】:2021-01-19 09:30:57 【问题描述】:

切换命令可以如下使用:

toggle
toggle n
toggle >hotspot y
toggle >hotspot
toggle @location>hotspot n
toggle @location>hotspot

我现在的正则表达式如下:

^toggle(?>\s(?>@(?'location'\w+))?(?>>(?'hotspot'\w+))?)?(?>\s(?'value'n|y))?$

然而,这一个允许以下字符串匹配:

toggle @location
toggle @location n

我希望仅当命名组“热点”(以“>”为前缀)匹配时才允许命名组“位置”(以“@”为前缀)。

【问题讨论】:

热点不应该是可选的^toggle(?>\s(?>@(?'location'\w+))?(?>>(?'hotspot'\w+)))?(?>\s(?'value'[ny]))?$regex101.com/r/Vb1xHE/1 你说得对,其实超级简单!如果热点是在价值之后呢?我的意思是,只有当前缀+命名组匹配时才允许组? 在这种情况下,您可以使用肯定的前瞻断言来确保字符串至少包含您需要的内容。然后,我认为您可以将其他组设为可选。 我认为这是一个很好的例子来调查你是否真的需要一个正则表达式。 【参考方案1】:

在您尝试的模式中,hotspot 组不应是可选的。

还有一些原子组(?>,如果您稍微更改分组以选择匹配空白字符,则这些原子组不是必需的。

这部分n|y也可以写成字符类[ny]

^toggle(?:\s(?:@(?'location'\w+))?>(?'hotspot'\w+))?(?:\s(?'value'[ny]))?$

说明

^ 字符串开始 toggle 字面匹配 (?:非捕获组 \s 匹配一个空格字符 (?:@(?'location'\w+))? 可选匹配@,在组中捕获location 1+ word chars >(?'hotspot'\w+)匹配>,组内捕获hotspot1+字字符 )? 关闭群组并将其设为可选 (?:非捕获组 \s(?'value'[ny]) 匹配一个空白字符,在value 组中捕获ny )? 关闭组并使其成为可选 $ 字符串结束

.NET regex demo

【讨论】:

以上是关于正则表达式 - 仅当另一个命名组匹配时命名组的主要内容,如果未能解决你的问题,请参考以下文章

Boost 正则表达式:获取命名组

正则表达式中的命名捕获组

正则表达式进阶

正则表达式之基础

Java 正则表达式之捕获组

使用 re.findall 在正则表达式中捕获命名组