正则表达式 - 仅当另一个命名组匹配时命名组
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+)
匹配>
,组内捕获hotspot
1+字字符
)?
关闭群组并将其设为可选
(?:
非捕获组
\s(?'value'[ny])
匹配一个空白字符,在value
组中捕获n
或y
)?
关闭组并使其成为可选
$
字符串结束
.NET regex demo
【讨论】:
以上是关于正则表达式 - 仅当另一个命名组匹配时命名组的主要内容,如果未能解决你的问题,请参考以下文章