为什么我不能构建这个正则表达式

时间:2016-07-21 19:42:04

标签: c++ regex c++11 runtime-error construct

我写了这个正则表达式:

(.+?)\s*{?\s*(.+?;)\s*}?\s*

哪种测试很好:https://regex101.com/r/gD2eN7/1

但是当我尝试用C ++构造它时,我得到一个运行时错误。

  

temp2.​​exe中0x7714C52F处的未处理异常:Microsoft C ++异常:
  std :: regex_error在内存位置0x003BF2EC。

const auto input = "if (KnR)\n\tfoo();\nif (spaces) {\n    foo();\n}\nif (allman)\n{\n\tfoo();\n}\nif (horstmann)\n{\tfoo();\n}\nif (pico)\n{\tfoo(); }\nif (whitesmiths)\n\t{\n\tfoo();\n\t}"s;

cout << input << endl;

cout << regex_replace(input, regex("(.+?)\\s*{?\\s*(.+?;)\\s*}?\\s*"), "$1 {\n\t$2\n}\n") << endl;

Live Example

我使用的是C ++不支持的功能吗?

1 个答案:

答案 0 :(得分:4)

你需要摆脱花括号。请参阅std::regex ECMAScript flavor reference

  

\character
  字符字符不是在正则表达式中解释其特殊含义。   任何字符都可以转义,除了那些形成上述任何特殊字符序列的字符。   
需要:^ $ \ . * + ? ( ) [ ] { } |

regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1 {\n\t$2\n}\n")

这是IDEONE demo

#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main() {
    const auto input = "if (KnR)\n\tfoo();\nif (spaces) {\n    foo();\n}\nif (allman)\n{\n\tfoo();\n}\nif (horstmann)\n{\tfoo();\n}\nif (pico)\n{\tfoo(); }\nif (whitesmiths)\n\t{\n\tfoo();\n\t}"s;

    cout << regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1 {\n\t$2\n}\n") << endl;
    //                                           ^^                ^^
}