C++ 正则表达式,丢失结果组

C++ 正则表达式,丢失结果组,c++,regex,C++,Regex,我的cpp应用程序正在尝试使用以下模式分析字符串: ^\/color( set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})$ 试运行 /颜色集#ffffff-获得两组('set和'#ffffff')) /颜色设置为红色-使用“红色”获取1个组,使用“设置”的组发生了什么? 问题是,您的分组不正确/不必要。使用以下命令: ^\/color\s(set|update)?\s?(#[A-Fa-f0-9]{6}|#[A-Fa

我的cpp应用程序正在尝试使用以下模式分析字符串:

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

/颜色集#ffffff-获得两组('set和'#ffffff'))

/颜色设置为红色-使用“红色”获取1个组,使用“设置”的组发生了什么?
问题是,您的分组不正确/不必要。使用以下命令:

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

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

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

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

(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})
根据对它们进行分组的方式和OR运算符的优先级,如果这两个正则表达式中的任何一个为true,则基本上将其评估为捕获:

^\/color( set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})
([a-zA-Z]{1,20})$
由于字符串“/color set red”与十六进制检查不匹配,因此它确定左侧为false,只有右侧为true。因此,它为什么要抓住权利

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

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

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

(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|([a-zA-Z]{1,20})
根据对它们进行分组的方式和OR运算符的优先级,如果这两个正则表达式中的任何一个为true,则基本上将其评估为捕获:

^\/color( set| update)? (#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})
([a-zA-Z]{1,20})$
由于字符串“/color set red”与十六进制检查不匹配,因此它确定左侧为false,只有右侧为true。因此,它为什么要抓住权利

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

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

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

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

测试正则表达式。此外,下面将找到一个没有命名捕获的版本,因为SebastianRedl指出C++不支持这个特性。
^\/color\s+(set | update)?\s*(#[afafaf09]{6}|[A-Fa-f0-9]{3}|[A-zA-Z]{1,20})s*$

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

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

测试正则表达式。此外,下面将找到一个没有命名捕获的版本,因为SebastianRedl指出C++不支持这个特性。
^\/color\s+(set | update)?\s*(#[afafaf09]{6}|[A-Fa-f0-9]{3}|[A-zA-Z]{1,20})\s*$

你的问题是:@NathanOliver“带“set”的组发生了什么事?”@NathanOliver第二个示例中没有捕获操作集,如果使用颜色名称而不是十六进制值,请检查正则表达式中
|
运算符的优先级。您的问题是?@NathanOliver“带“set”的组发生了什么事?“@NathanOliver第二个示例中未捕获操作集,如果使用颜色名称而不是十六进制值,请检查正则表达式中
|
运算符的优先级。谢谢。我会接受这个答案,但您的图案与/color red不匹配(如果中间只有一个空格),这就是我在结果组中放置空格的原因问题在于
\s(set | update)?\s
。它必须是
(?:\s(set | update))?
@danilabagroff需要将空间设置为可选空间。检查编辑如果我猜对了OP的意图,它应该是
。|[A-Fa-f0-9]{3}}|
而不是
。|[A-Fa-f0-9]{3}|
。谢谢。我会接受这个答案,但您的图案与/color red不匹配(如果中间只有一个空格),这就是我在结果组中放置空格的原因问题在于
\s(set | update)?\s
。它必须是
(?:\s(set | update))?
@danilabagroff需要将空间设置为可选空间。检查EdiTIFF,我正确地猜测OP的意图,应该是“代码>……[AG-FA-F09] { 3 }…<代码> > <代码>……[AF-F-9] { 3 }…<代码>。C++ ReX不支持命名捕获。@ SEBASTAYNEDRL好,我将添加另一个版本。C++ + ReX不支持命名捕获。@ SEBASTAYNEDRL好,我将添加另一个版本。