C++ Boost正则表达式。两部分命名组

C++ Boost正则表达式。两部分命名组,c++,regex,boost,regex-group,boost-regex,C++,Regex,Boost,Regex Group,Boost Regex,我对boost::regex::regex\u match有问题。我使用打开的BOOST\u REGEX\u MATCH\u EXTRA工作 我所拥有的: (这是我问题的一个简单例子,不是真正的任务) 我想要的: list output1= [3 4 5]; list output2= []; //not matched ((?<group>[0-6])[ ])*(?<group>[0-6]) ((?<group>[0-6])[ ])*(?&gr

我对boost::regex::regex\u match有问题。我使用打开的
BOOST\u REGEX\u MATCH\u EXTRA
工作


我所拥有的:

(这是我问题的一个简单例子,不是真正的任务)

我想要的:

list output1= [3 4 5];
list output2= []; //not matched
((?<group>[0-6])[ ])*(?<group>[0-6])
((?<group>[0-6])[ ])*(?&group)

regex:

(这工作正常)

输出1:
what[“group”]=4
what[“group”].captures()=[3,4]

输出2:
不匹配

好的,我明白了。它没有看到组的第二次声明

我试过:

list output1= [3 4 5];
list output2= []; //not matched
((?<group>[0-6])[ ])*(?<group>[0-6])
((?<group>[0-6])[ ])*(?&group)
((?[0-6])[])*(?&group)
输出1:
what[“group”]=4
what[“group”].captures()=[3,4,4]

输出2:
不匹配

  • 但这是什么?第二个4来自哪里?它检查“组”模式,因为第一个示例匹配,但第二个不匹配。但它会将上次找到的值翻倍,而不是保存新值。为什么?也许我忘了打开一些旗子
  • 还有其他方法可以从正则表达式的不同部分获取一组数据吗

我有不止一个组,所以令牌迭代器不能帮助我


和表达式应在配置文件中配置。静态Xpressive无法使用。

我就是这样解释您的问题的:

字符串:
总价:$1234

您希望将成本记录为
1234
(不带逗号)

<>这是不可能的,只有正则表达式,因为没有办法捕获一个组和排除部分在中间。也就是说,您可以使用2个匹配组和lookaheads,然后在代码内部将这些组缝合在一起。使用上述示例,如果您不知道是否会有逗号(即价格范围为1-5000),您可以执行以下操作

总价:\$(?p\d{1,3})(?:(?=\,),(?p\d{3})

匹配1-3个数字,然后查找逗号,如果存在,请使用其他名称组并匹配第二个块


这里有一个非常好的正则表达式测试资源:

不,你不能把目标字符串的两个不同部分塞进一个捕获组中——至少不能不捕获它们之间的所有内容。当然,我可以通过添加代码来实现这一点。此外,通过添加代码,我完全可以在没有正则表达式的情况下完成这项工作。但我想把正则表达式保存到配置文件中。但是,创建这样的加法代码并不容易,因为它可以处理任何未知的正则表达式。我不知道会有多少组(price,price2,price3…),以及在哪些组中order@Darida我现在正在处理一个类似的案子。我目前的解决方案是,在配置文件中,我不仅保留regex模式,还保留“值描述”。基本上,它只是捕获组名和任意字符串的序列。代码将字符串和模式匹配,如果成功,它将基于连接所提到的捕获组的“值描述”以及指定的内容构建实际值。这允许在配置文件中具有合理的灵活性,同时仍保留固定的代码。