从 .* 的构造函数抛出的 boost 正则表达式异常

Posted

技术标签:

【中文标题】从 .* 的构造函数抛出的 boost 正则表达式异常【英文标题】:boost regex exception thrown from constructor for .*从 .* 的构造函数抛出的 boost 正则表达式异常 【发布时间】:2016-04-14 16:24:02 【问题描述】:

Boost 版本 1.60.0 gcc 4.8.4

当我使用字符串构造 boost::regex 对象时:.* 我得到一个异常说明:

what():  Missing  in quantified repetition.  The error occurred while parsing the regular expresion: '.*>>>HERE>>>'.

当对象是 boost::regex::extended 类型时会出现此错误,但如果是 boost::regex::perl 则不会。

所以下面抛出异常:

regString(".*");
boost::regex reg_e(regString, boost::regex::extended);

但事实并非如此:

regString(".*");
boost::regex reg_p(regString, boost::regex::perl);

这是预期的行为还是错误? 如果是预期的,为什么?什么是合适的解决方法?

【问题讨论】:

【参考方案1】:

是一个特殊字符在这种情况下,你需要转义它。

http://www.boost.org/doc/libs/1_60_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html

请注意,“”和“”字符将被视为普通文字 在不重复的上下文中使用时:这匹配 Perl 5.x 行为。例如在表达式“ab1”、“ab1”和“abc”中 大括号都被视为文字,不会出错 提出来。

【讨论】:

啊,我明白这是怎么回事了。为了完整起见,即使正则表达式字符串为 .*\,我也会遇到 boost::regex::basic 类型的相同错误 是的,它有效。我正在为所有 3 种类型(基本、扩展、Perl 兼容)创建正则表达式对象,所以当另一种工作时会失败。我现在分别尝试/捕获每个对象构造,并在一个失败时向用户报告,同时允许其他对象继续。谢谢!

以上是关于从 .* 的构造函数抛出的 boost 正则表达式异常的主要内容,如果未能解决你的问题,请参考以下文章

vs2010中c++的正则表达式的函数

尝试在 C++ 中使用 boost 正则表达式匹配从字符串转换为 int 时出错

从 lambda 表达式中抛出的已检查异常

与 Boost 的正则表达式区分大小写的部分匹配

使用 or 匹配正则表达式

使用 Boost::regex 进行正则表达式组匹配