簡體   English   中英

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

[英]Nested string replace using 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將不包含任何類型的變量。

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

您需要在makeToken中使用某種循環:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM