首页 > 解决方案 > 使用 C++ 替换嵌套字符串

问题描述

我想用指定的字符串替换字符串中的每个变量。

namespace math {

    map<string,string> setVar;

    string setVariable(string& str, const map<string,string>& variables) {
        for(auto& m : variables) {
            size_t pos;
            while((pos=str.find(m.first)) != string::npos)
                str.replace(pos,m.first.length(),"("+m.second+")");
        }
        return str;
    }
    bool isStillContainVariable(const string& str, const map<string,string>& variables) {
        for(auto& m : variables)
            return (str.find(m.first)!=string::npos) ? false : true;
        return false;
    }
    vector<string> makeToken(string& str) {
        if(setVar.size()!=0) {
            str = setVariable(str,setVar);
            str = isStillContainVariable(str,setVar) ?
                        setVariable(str,setVar) : str;
        }
        cout << str << endl;

        vector<string> res;
        .....     //I tokenize the string
        return res;
    }
}

如果我使用以下代码,它会正确地重新生成字符串。

int main() {
    string str = "-(-(x)+lg(y)+5+ln(z))";
    math::setVar["x"] = "lg(pi*lg(y))";
    math::setVar["y"] = "z";
    math::setVar["z"] = "10";
    auto res = math::makeToken(str);
    return 0;
}

但是如果我使用下面的代码,解决方案只是(x),但正确的解决方案是sin(pi)

string str = "z";
math::setVar["x"]="sin(y)";
math::setVar["y"]="pi";
math::setVar["z"]="x";
auto res = math::makeToken(str);

string如果替换正确,则替换后将不包含任何类型的变量。

我完全不知道如何重新设置字符串。

标签: c++replace

解决方案


你需要某种循环makeToken

while (isStillContainsVariables(...))
{ ... do the replacement ... }

推荐阅读