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

regex - named group only if another named group matches

切换命令可以使用如下:

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

我想仅当命名组“hotspot”(以“>”为前缀)匹配时才允许命名组“location”(以“@”为前缀)。

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

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

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

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

说明

  • ^ 字符串开头
  • toggle字面匹配
  • (?:非捕获组
    • \s 匹配空白字符
    • (?:@(?'location'\w+))? 可选匹配@,在组中捕获location 1+ 字字符
    • >(?'hotspot'\w+)匹配>,分组抓包hotspot 1+字字符
  • )? 关闭组并使其可选
  • (?:非捕获组
    • \s(?'value'[ny]) 匹配空白字符,在组 value 中捕获 ny
  • )? 关闭组并使其可选
  • $ 字符串结束

.NET regex demo