C++ Boost正则表达式。两部分命名组
我对boost::regex::regex\u match有问题。我使用打开的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\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模式,还保留“值描述”。基本上,它只是捕获组名和任意字符串的序列。代码将字符串和模式匹配,如果成功,它将基于连接所提到的捕获组的“值描述”以及指定的内容构建实际值。这允许在配置文件中具有合理的灵活性,同时仍保留固定的代码。