c++ - boost 正则表达式。命名组分为两部分

标签 c++ regex boost regex-group boost-regex

我对 boost::regex::regex_match 有疑问。我使用打开的 BOOST_REGEX_MATCH_EXTRA 工作。


我有什么:

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

string input1= "3 4 5";
string input2= "3 4 7";

我想要得到的:

list output1= [3 4 5];
list output2= []; //not matched

正则表达式:

(这工作正常)

((?<group>[0-6])[ ]?)*

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

输出 2:不匹配

问题是:

我需要从一组正则表达式的多个部分收集数据。

我试过了:

((?<group>[0-6])[ ])*(?<group>[0-6])

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

输出 2:不匹配

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

我试过了:

((?<group>[0-6])[ ])*(?&group)

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

输出 2:不匹配

  • 但是这是什么?第二个 4 来自哪里? 它检查“组”模式,因为第一个示例匹配,但第二个不匹配。但它加倍了最后发现的值(value)而不是保存新的。为什么?也许我忘了打开一些标志?
  • 还有另一种方法可以从正则表达式的不同部分获取一组数据吗?

我有不止一组,所以 token_iterator 帮不了我。

表达式应该在配置文件中配置。不能使用静态 Xpressive。

最佳答案

我是这样解释你的问题的:

字符串: Total price: $1,234

并且您想将成本捕获为 1234 (没有逗号)

仅使用正则表达式这是不可能的,因为无法捕获组并排除中间部分。也就是说,您可以使用 2 个匹配组和前瞻,然后在内部代码中将这些组拼接在一起。使用上面的示例,如果您不知道是否会有逗号(即价格范围为 1-5000),您可以执行类似

的操作

Total price: \$(?P<price>\d{1,3})(?:(?=\,),(?P<price2>\d{3})|)

匹配1-3个数字,然后寻找一个逗号,如果存在,则使用不同的名称组并匹配第二个 block 。

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

关于c++ - boost 正则表达式。命名组分为两部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890866/

相关文章:

c++ - QDir currentPath 和 cd() 不工作?

c++ - pthread_join() 在 iOS 上失败

java - .split() 包含字符 "++"的字符串

c++ - 为什么 std/boost::format 会导致这种 c_str() 行为?

c++ - 如何使用复合键获取 boost::multi_index_container 中第一个键的不同计数

c++ - 使用 boost::math::binomial_coefficient 对二项式系数进行整数计算,返回值为 boost::multiprecision::cpp_int?如何?

c++ - 在类中复制和存储 LPTSTR 会导致崩溃

c++ - 封装一个 "include"所以只暴露选定的类

regex - 重复子序列的有效正则表达式

java - 正则表达式检查括号是否平衡