我有一个数学表达式字符串,需要用空格替换括号及其中的所有内容。我是在Visual Studio Express 2012中完成的。
input =>的示例输出:
"(a+b)*c+(x+y)" => " *c+ "
"a+b" => "a+b"
"(a+b)" => " "
我有代码,它取代了我需要的代码,但它也取代了除+
之外的所有内容:
#include <iostream>
#include <string>
#include <regex>
std::string foo(std::string input) {
std::string output;
std::regex r("\\([^()]+\\)|(([a-z]|\\*)+)");
std::smatch m;
while (std::regex_search(input, m, r)) {
output += m.prefix();
output += std::string(m[0].length(), ' '); //here finded parts is replacing
input = m.suffix();
}
output += input;
return output;
}
void test(const std::string &in, const std::string &expected_out) {
std::string real_out = foo(in);
if (real_out == expected_out) {
std::cout << "PASS" << std::endl;
} else {
std::cout << "FAIL: got \"" << real_out << "\" instead of \"" <<
expected_out << "\"" << std::endl;
}
}
int main() {
test("", "");
test("a", " ");
test("a*b*c", " ");
test("a+b", " + ");
test("(a+b*c)+x*y", " + ");
test("(a+b*c)+x+y", " + + ");
test("a+b*c+(x+y)", " + + ");
system ("pause");
return 0;
}
事实上,我只需要修复正则表达式。
由于标准的正则表达式无法处理嵌套结构,我必须得到关于象牙的一些细节。所以,你可以忽略这个选项。
答案 0 :(得分:3)
[^\n](?=(?:[^(\n]*\))|((?:[^()\n]*\([^()\n]*\))*[^\(\n]*\)))|\)
试试这个。参见demo.Replace by space
。