简体   繁体   English

使用 C++ 替换嵌套字符串

[英]Nested string replace using C++

I want to replace every single variables in a string with specified strings.我想用指定的字符串替换字符串中的每个变量。

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;
    }
}

If I use the following code it reaplce the string correctly.如果我使用以下代码,它会正确地重新生成字符串。

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;
}

But if I use the following code, the solution is just (x) , but the correct solution would be sin(pi)但是如果我使用下面的代码,解决方案只是(x) ,但正确的解决方案是sin(pi)

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

After the replace the string will not contain any kind of variables if the replace is correct.如果替换正确,则替换后的string将不包含任何类型的变量。

I have complety no idea how to reaplce the string.我完全不知道如何重新设置字符串。

You need some kind of loop within makeToken :您需要在makeToken中使用某种循环:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM