为什么这个正则表达式抛出异常?

时间:2015-04-06 17:28:22

标签: c++ regex exception c++11

我正在尝试在C ++ 11(Visual Studio 2013)中使用std::regex_replace,但我正在尝试创建的正则表达式抛出异常:

Microsoft C++ exception: std::regex_error at memory location 0x0030ED34

为什么会这样?这是我的定义:

std::string regexStr = R"(\([A - Za - z] | [0 - 9])[0 - 9]{2})";

std::regex rg(regexStr); <-- This is where the exception thrown

line = std::regex_replace(line, rg, this->protyp->getUTF8Character("$&"));

我想做什么:查找字符串中的所有匹配项,其格式如下:

“\ X99”或“\ 999” 其中X = A-Z或a-z且9 = 0-9。

我也尝试使用boost regex库,但它也会抛出一个异常。

(另一个问题:我可以在最后一行使用反向引用吗?我想根据匹配动态替换)

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

根据上述评论,您需要修复正则表达式:要匹配您需要使用"\\\\"(或R("\\"))的文字反斜杠。

我的代码显示了所有首批捕获的组:

string line = "\\X99 \\999";
string regexStr = "(\\\\([A-Za-z]|[0-9])[0-9]{2})";
regex rg(regexStr); //<-- This is where the exception was thrown before
smatch sm;
while (regex_search(line, sm, rg)) {
        std::cout << sm[1] << std::endl;
        line = sm.suffix().str();
    }

输出:

\X99
\999

关于在替换字符串中使用方法调用,我在regex_replace documentation中找不到这样的功能:

  

fmt - 正则表达式替换格式字符串,确切的语法取决于   标志值