boost::regex 中的嵌套量词

Posted

技术标签:

【中文标题】boost::regex 中的嵌套量词【英文标题】:Nested quantifiers in boost::regex 【发布时间】:2010-08-29 06:52:33 【问题描述】:

在不支持所有格量​​词的编程语言中,\d++ 是一个有效的正则表达式吗?它是否等同于(\d+)+

在 Python 中测试时,会引发错误sre_constants.error: multiple repeat。在 C# 中,它会抛出运行时异常:System.ArgumentException: parsing "\d++" - Nested quantifier +。以及 boost::xpressive。 但是\d++...+ 在 boost::regex 中被认为是有效的。

wchar_t* s = L"abc123" ;
wregex e(L"\\d+++", boost::regex::normal) ;
wcmatch m ;

if(regex_search(s, m, e))
    wcout <<  m[0] << endl ;

输出为123

【问题讨论】:

【参考方案1】:

上面的代码为我抛出了一个 boost::bad_expression 的实例,其中包含“无效的前置正则表达式”。 它是一个用 gcc 3.4.6 和 boost 1_32 编译的 redhat linux 系统。

【讨论】:

我用 Visual C++ 2008 编译它并提升 1.36|1.44。【参考方案2】:

如果没有所有格量词,\d++(或(\d+)+)是什么意思?

假设它是一个有效的语法,我们可以将它读作“一个或多个(一个或多个数字)”。在这种情况下,我们仍然可以将表达式简化为 \d+\d+ 匹配一个数字,因此 (\d+)+ 可以简化为 (\d)+,它仍然匹配一个或多个数字)。因此,\d++ 将是多余的。

除了支持所有格量​​词的引擎之外,我不知道任何正则表达式引擎 \d++ 是有效语法。

【讨论】:

以上是关于boost::regex 中的嵌套量词的主要内容,如果未能解决你的问题,请参考以下文章

什么是“嵌套量词”,为什么它会导致我的正则表达式失败?

如何在 OO 编程中实现存在量词?

使用 boost::regex 遍历捕获

EXISTS/NOT EXISTS实现全称量词的查询(双重否定)

C++ 中三种正则表达式比较(C regex,C ++regex,boost regex)

boost regex expression