繁体   English   中英

正则表达式,结果组丢失

[英]Regular expression, lost result group

我的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') 在此处输入图片说明

/ color set red-用“ red”得到1个组,用“ set”的组发生了什么? 在此处输入图片说明

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

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

DEMO

您的问题与正则表达式的这一部分有关。

(#[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})$

由于字符串“ / color set red”与十六进制检查不匹配,因此它确定左侧为假,而右侧为真。 因此,为什么它要争取权利。

我建议以此方式重写您的正则表达式。 这样,它将在字符串的每个参数之间考虑一个或多个空格和制表符。

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

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

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

单击此处测试正则表达式。 另外,由于SebastianRedl指出C ++不支持此功能,因此在下面还会找到没有命名捕获的版本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM