Replace part of a string with another string

前端 未结 15 2346
终归单人心
终归单人心 2020-11-22 02:54

Is it possible in C++ to replace part of a string with another string?

Basically, I would like to do this:

QString string(\"hello $name\");
string.re         


        
相关标签:
15条回答
  • 2020-11-22 03:25

    std::string has a replace method, is that what you are looking for?

    You could try:

    s.replace(s.find("$name"), sizeof("$name") - 1, "Somename");
    

    I haven't tried myself, just read the documentation on find() and replace().

    0 讨论(0)
  • 2020-11-22 03:25
    wstring myString = L"Hello $$ this is an example. By $$.";
    wstring search = L"$$";
    wstring replace = L"Tom";
    for (int i = myString.find(search); i >= 0; i = myString.find(search))
        myString.replace(i, search.size(), replace);
    
    0 讨论(0)
  • 2020-11-22 03:25

    I'm just now learning C++, but editing some of the code previously posted, I'd probably use something like this. This gives you the flexibility to replace 1 or multiple instances, and also lets you specify the start point.

    using namespace std;
    
    // returns number of replacements made in string
    long strReplace(string& str, const string& from, const string& to, size_t start = 0, long count = -1) {
        if (from.empty()) return 0;
    
        size_t startpos = str.find(from, start);
        long replaceCount = 0;
    
        while (startpos != string::npos){
            str.replace(startpos, from.length(), to);
            startpos += to.length();
            replaceCount++;
    
            if (count > 0 && replaceCount >= count) break;
            startpos = str.find(from, startpos);
        }
    
        return replaceCount;
    }
    
    0 讨论(0)
  • 2020-11-22 03:26

    My own implementation, taking into account that string needs to be resized only once, then replace can happen.

    template <typename T>
    std::basic_string<T> replaceAll(const std::basic_string<T>& s, const T* from, const T* to)
    {
        auto length = std::char_traits<T>::length;
        size_t toLen = length(to), fromLen = length(from), delta = toLen - fromLen;
        bool pass = false;
        std::string ns = s;
    
        size_t newLen = ns.length();
    
        for (bool estimate : { true, false })
        {
            size_t pos = 0;
    
            for (; (pos = ns.find(from, pos)) != std::string::npos; pos++)
            {
                if (estimate)
                {
                    newLen += delta;
                    pos += fromLen;
                }
                else
                {
                    ns.replace(pos, fromLen, to);
                    pos += delta;
                }
            }
    
            if (estimate)
                ns.resize(newLen);
        }
    
        return ns;
    }
    

    Usage could be for example like this:

    std::string dirSuite = replaceAll(replaceAll(relPath.parent_path().u8string(), "\\", "/"), ":", "");
    
    0 讨论(0)
  • 2020-11-22 03:27

    If all strings are std::string, you'll find strange problems with the cutoff of characters if using sizeof() because it's meant for C strings, not C++ strings. The fix is to use the .size() class method of std::string.

    sHaystack.replace(sHaystack.find(sNeedle), sNeedle.size(), sReplace);
    

    That replaces sHaystack inline -- no need to do an = assignment back on that.

    Example usage:

    std::string sHaystack = "This is %XXX% test.";
    std::string sNeedle = "%XXX%";
    std::string sReplace = "my special";
    sHaystack.replace(sHaystack.find(sNeedle),sNeedle.size(),sReplace);
    std::cout << sHaystack << std::endl;
    
    0 讨论(0)
  • 2020-11-22 03:28

    If you want to do it quickly you can use a two scan approach. Pseudo code:

    1. first parse. find how many matching chars.
    2. expand the length of the string.
    3. second parse. Start from the end of the string when we get a match we replace, else we just copy the chars from the first string.

    I am not sure if this can be optimized to an in-place algo.

    And a C++11 code example but I only search for one char.

    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    void ReplaceString(string& subject, char search, const string& replace)
    {   
        size_t initSize = subject.size();
        int count = 0;
        for (auto c : subject) { 
            if (c == search) ++count;
        }
    
        size_t idx = subject.size()-1 + count * replace.size()-1;
        subject.resize(idx + 1, '\0');
    
        string reverseReplace{ replace };
        reverse(reverseReplace.begin(), reverseReplace.end());  
    
        char *end_ptr = &subject[initSize - 1];
        while (end_ptr >= &subject[0])
        {
            if (*end_ptr == search) {
                for (auto c : reverseReplace) {
                    subject[idx - 1] = c;
                    --idx;              
                }           
            }
            else {
                subject[idx - 1] = *end_ptr;
                --idx;
            }
            --end_ptr;
        }
    }
    
    int main()
    {
        string s{ "Mr John Smith" };
        ReplaceString(s, ' ', "%20");
        cout << s << "\n";
    
    }
    
    0 讨论(0)
提交回复
热议问题