【问题标题】:Boost Regex will not CompileBoost Regex 不会编译
【发布时间】:2014-10-29 13:17:45
【问题描述】:

出于速度和内存管理的原因,我正在将 PHP 程序转换为 C++。因为PHP uses Perl-Compatible syntax,所以我去了also uses the Perl syntax的boost库

使用 Visual Studio Express 2013,我能够按原样使用 7 个表达式中的 6 个。最适合我的是下面

^([\w]+= {\s*(?:[a-f0-9]{2}\s+)*})\s*

在代码中使用如下:

#include <string>
#include <boost/regex.hpp>
std::string regexError = R"~(^([\w]+= {\s*(?:[a-f0-9]{2}\s+)*})\s*)~";
boost::regex e(regexError);

这个表达式匹配这样的字符串Regex101 Example:

MASKSUBSYS= { 00 af 01 02 }

我在调用 boost::regex e(regexError); 时遇到以下运行时异常

RegexTest.exe 中 0x7515C41F 处未处理的异常:Microsoft C++ 异常:boost::exception_detail::clone_impl > 内存位置 0x002DED5C。

从读入内存的原始字符串中可以看出,黑斜线转义似乎没有问题。

就像我说的,7 个表达式中只有 1 个不会直接从 PHP 编译出来。我猜它与正则表达式的基础知识有关,但我对正则表达式的精通程度不足以识别它。这甚至不是迄今为止最复杂的表达方式!有任何想法吗?

【问题讨论】:

  • 我不确定[\w]+ 是否真的是您需要的[] 应该是一组字符。我会在那里简单地使用\w+。另外我认为你需要逃避你的{}。比如:R"~(^(\w+= \{\s*(?:[a-f0-9]{2}\s+)*\})\s*)~"
  • 你是对的。你应该已经回答了这个问题!

标签: c++ regex boost


【解决方案1】:

问题很可能是大括号{ } 元字符也需要转义。而不是在\w 周围放置一个字符类,你可以自己写出来,如下所示。

R"~(^(\w+= \{\s*(?:[a-f0-9]{2}\s+)*\})\s*)~"

Code Demo

【讨论】:

  • 呃!...我从未见过stacked-crooked.com。谢谢!
猜你喜欢
  • 2012-07-14
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2011-12-09
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多