c++ - 为什么这个正则表达式会导致我的程序崩溃?

标签 c++ regex visual-studio-2010

<分区>

我正在编写一个正则表达式来提取目录和文件名。我在正则表达式测试器中测试了它,它似乎在那里工作,但是当我在我的 C++ 程序中运行它时它崩溃了。

regex re("^(.*)(\\/|\\\)(.*\\.flt)$");

我正在使用 Visual Studio 2010 SP1 进行编译。当我运行代码时,它在上面给出的行上中断。为什么?

编辑:我得到的异常(exception)是

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

它在 regex.cpp 的第 19 行中断

最佳答案

问题是您错误地转义了反斜杠:

(\\/|\\\)

这应该意味着“正斜杠或反斜杠”将首先由编译器转换。以反斜杠开头的每对字符将根据转义序列替换为单个字符。

\\ 是代表 \ 的有效转义序列。但是,\) 不是有效的转义序列,因此它将被替换为 )。因此,正则表达式构造函数将“看到”这个:

(\/|\)

这会转义右括号,导致语法错误。

字符类为您的情况提供了更好的语法:使用单个

[/\\\\]

C++替换转义序列后,regex构造函数会看到这个构造,

[/\\]

表示“正斜杠或反斜杠”。

关于c++ - 为什么这个正则表达式会导致我的程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786164/

相关文章:

C++多重继承/虚继承

c++ - 从自定义集合中读取数据(结构数组)

python - 正则表达式 - 在字符串中查找最后找到的符号的位置

c++ - 导入的 "RegExp.tlb"的 C++ COM 接口(interface)是否在进程之间隐式共享内存?

c++ - C++字数统计程序

c++ - 编译 SAX 打印示例 (xerces)

java - 用于捕获目录和网站开头的正则表达式

c++ - MFC C++ LNK 2019 错误

c++ - 如何使用 CMake 组织我的文件?

visual-studio - CSS 文件无法在 Visual Studio 2010 SP1 中打开?