C ++。如何使用std :: regex替换括号(和括号)内的任何内容?

时间:2014-12-18 08:20:24

标签: c++ regex

我有一个数学表达式字符串,需要用空格替换括号及其中的所有内容。我是在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;
}

事实上,我只需要修复正则表达式。

由于标准的正则表达式无法处理嵌套结构,我必须得到关于象牙的一些细节。所以,你可以忽略这个选项。

1 个答案:

答案 0 :(得分:3)

[^\n](?=(?:[^(\n]*\))|((?:[^()\n]*\([^()\n]*\))*[^\(\n]*\)))|\)

试试这个。参见demo.Replace by space

https://regex101.com/r/cA4wE0/18