c++ - 为什么这个正则表达式模式 (tr1::regex) 会出现异常?

标签 c++ regex

我遇到了 tr1::regex (VS2008) 的一个非常奇怪的问题,我无法找出原因。帖子末尾的代码编译正常,但在执行期间到达第 4 个正则表达式定义时抛出异常:

Microsoft C++ exception: std::tr1::regex_error at memory location 0x0012f5f4..

但是,我能看到的第 3 个和第 4 个之间的唯一区别(也许我是盲人)是“NumberOfComponents”而不是“SchemeVersion”。起初我想也许两者(第 3 和第 4)都是错误的,第 3 个错误只是在第 4 个中触发。情况似乎并非如此,因为我移动了它们并在它们之间放置了多个其他正则表达式定义。有问题的行总是触发异常。

有没有人知道为什么那条线

std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

触发异常但是

std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");

不是吗?运行时只是在搞乱我吗?

感谢您花时间阅读本文并提供任何见解。

PS:我完全确定解决方案非常简单,我必须将头撞到最近的墙上才能平衡“愚蠢的问题”业力......


#include <regex>

int main(void)
{
   std::tr1::regex rxSepFileIdent("Scanner Separation Configuration");
   std::tr1::regex rxScannerNameIdent("\\ScannerName:((\\s*\\w+)+)");

   std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");
   std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

   std::tr1::regex rxConfigStartIdent("Configuration Start");
   std::tr1::regex rxConfigEndIdent("Configuration End");

   return 0;
}

最佳答案

您需要对反斜杠进行两次转义 - 一次用于正则表达式本身,第二次用于它们所在的字符串。

以 S 开头的那个有效,因为 \S 是一个有效的正则表达式转义(非空白字符)。以 N 开头的不是(因为 \N 不是有效的正则表达式转义)。

而是使用 "\\\\SchemeVersion: 等等。

关于c++ - 为什么这个正则表达式模式 (tr1::regex) 会出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2360563/

相关文章:

python - [\w\d] 中的\d 不是多余的吗?

c++ - 用 3 个点匹配域的正则表达式

c++ - SDL_Surface 透明度问题

php - preg_match HTML 文件的一部分 : find X and (maybe X or not) until the end of HTML file

javascript - 光滑 slider 正则表达式过滤

.net - 将PCRE递归正则表达式模式转换为.NET平衡组定义

c++ - 匿名空无标记类、结构、 union 和枚举

c++ - 关闭 session 后 Tensorflow C++ 不释放 GPU 资源

c++ - MST Kruskal 算法(时间限制)

c++ - 抽象基类中的静态常量变量