我写了这个正则表达式:
(.+?)\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;
我使用的是C ++不支持的功能吗?
答案 0 :(得分:4)
你需要摆脱花括号。请参阅std::regex
ECMAScript flavor reference:
\character
字符字符不是在正则表达式中解释其特殊含义。 任何字符都可以转义,除了那些形成上述任何特殊字符序列的字符。
需要:^
$
\
.
*
+
?
(
)
[
]
{
}
|
regex_replace(input, regex("(.+?)\\s*\\{?\\s*(.+?;)\\s*\\}?\\s*"), "$1 {\n\t$2\n}\n")
#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;
// ^^ ^^
}