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

Why does this regex cause my program to crash?

本文关键字:我的 程序 崩溃 正则表达式 为什么      更新时间:2023-10-16

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

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

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

编辑:我得到的例外是

Microsoft C++异常:内存位置的 std::tr1::regex_error 0x0042eb4c。

它在正则表达式的第 19 行中断.cpp

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

(\/|\)

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

\ 是表示 的有效转义序列。 但是,) 不是有效的转义序列,因此它将被替换为 ) 。因此,正则表达式构造函数将"看到"以下内容:

(/|)

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

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

[/\\]

C++替换转义序列后,正则表达式构造函数将看到此构造,

[/\]

意思是"正斜杠或反斜杠"。

相关文章: