【问题标题】: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
  • 你说得对,其实超级简单!如果热点是在价值之后呢?我的意思是,只有当前缀+命名组匹配时才允许组?
  • 在这种情况下,您可以使用肯定的前瞻断言来确保字符串至少包含您需要的内容。然后,我认为您可以将其他组设为可选。
  • 我认为这是一个很好的例子来调查你是否真的需要一个正则表达式。

标签: c# regex regex-group


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2016-04-29
    • 2016-02-11
    • 2018-07-30
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多