Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# regex-仅当另一个命名组匹配时命名组_C#_Regex_Regex Group - Fatal编程技术网

C# regex-仅当另一个命名组匹配时命名组

C# regex-仅当另一个命名组匹配时命名组,c#,regex,regex-group,C#,Regex,Regex Group,切换命令可按如下方式使用: 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
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

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

在您尝试的模式中,组
热点不应是可选的

还有一些原子组
(?>
),如果您将分组更改一点,可以选择匹配空格字符,则不需要这些原子组

此部分
n | y
也可以作为字符类
[ny]

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

  • ^
    字符串的开头
  • 切换
    按字面匹配
  • (?:
    非捕获组
    • \s
      匹配空白字符
    • (?:@(?'location'\w+))
      可选择匹配
      @
      ,在组
      位置中捕获
      1+字字符
    • (?'hotspot'\w+)
      匹配
      >
      ,在组中捕获
      hotspot
      1+字字符
  • )?
    关闭组并将其设置为可选
  • (?:
    非捕获组
    • \s(?'value'[ny])
      匹配空白字符,在组
      值中捕获
      n
      y
  • )?
    关闭组并将其设置为可选
  • $
    字符串结尾

热点不应是可选的
^切换(?>\s(?>@(?'location'\w+))(?>>(?'Hotspot'\w+))(?>\s(?'value'[ny]))?$
你说得对,它实际上非常简单!如果hotspot在值之后呢?我的意思是,只有前缀+命名组匹配时,有没有一种通用的方法允许组?在这种情况下,你可以使用肯定的前瞻断言来确保字符串至少包含你需要的内容。然后你可以让其他组我认为这是一个很好的例子,如果你真的需要正则表达式的话。