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 中的嵌套量词的主要内容,如果未能解决你的问题,请参考以下文章
EXISTS/NOT EXISTS实现全称量词的查询(双重否定)