正则表达式,丢失结果组

时间:2017-03-06 16:08:34

标签: c++ regex

我的cpp应用程序试图用模式解析字符串:

^\/color( set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})$

试运行

/ color set #ffffff - 获得2组('set和'#ffffff') enter image description here

/ color set red - 获取1组'red',组'set'发生了什么? enter image description here

3 个答案:

答案 0 :(得分:2)

问题是,您有不正确/不必要的分组。使用以下内容:

^\/color\s(set|update)?\s?(#[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})$

<强> DEMO

答案 1 :(得分:1)

你的问题在于正则表达式的这一部分。

(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})

通过将它们分组的方式和OR运算符的优先级,如果这两个正则表达式中的任何一个为真,它基本上被评估为捕获:

^\/color( set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})
([a-zA-Z]{1,20})$

由于字符串&#34; /颜色设置为红色&#34;不匹配十六进制检查,它确定左侧是假,只有右侧是真。因此,为什么它正在捕获权利。

我建议改写你的正则表达式。这样它就会在字符串中的每个参数之间占一个或多个空格和制表符。

^\/color[ \t]*(set|update)?[ \t]+(\#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})$

答案 2 :(得分:1)

我添加了命名组并修复了第二个空格的问题,导致/color red无法匹配,在省略操作的情况下。

^\/color\s+(?<op>set|update)?\s*(?<color>#[AFaf09]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})\s*$

Click here来测试正则表达式。另外,下面你会发现一个没有命名捕获的版本,因为 SebastianRedl 指出,C ++不支持这个功能。

^\/color\s+(set|update)?\s*(#[AFaf09]{6}|[A-Fa-f0-9]{3}|[a-zA-Z]{1,20})\s*$