使用C ++将一个字符串替换为另一个字符串

Ngu*_*Tâm 2 c++ str-replace c++14

问题是我不知道输入字符串的长度。如果输入字符串为“ yyyy”,则只能替换我的函数。我认为解决方案是,首先,我们将尝试将输入字符串转换回“ yyyy”,并使用我的函数完成工作。

这是我的功能:

void findAndReplaceAll(std::string & data, std::string toSearch, std::string replaceStr)
{
    // Get the first occurrence
    size_t pos = data.find(toSearch);

    // Repeat till end is reached
    while( pos != std::string::npos)
    {
        // Replace this occurrence of Sub String
        data.replace(pos, toSearch.size(), replaceStr);
        // Get the next occurrence from the current position
        pos = data.find(toSearch, pos + replaceStr.size());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能

std::string format = "yyyyyyyyyydddd";
findAndReplaceAll(format, "yyyy", "%Y");
findAndReplaceAll(format, "dd", "%d");
Run Code Online (Sandbox Code Playgroud)

我的预期输出应为:

%Y%d
Run Code Online (Sandbox Code Playgroud)

J. *_*cía 5

Use regular expressions.

Example:

#include <iostream>
#include <string>
#include <regex>
int main(){
    std::string text = "yyyyyy";
    std::string sentence = "This is a yyyyyyyyyyyy.";
    std::cout << "Text: " << text << std::endl;
    std::cout << "Sentence: " << sentence << std::endl;

    // Regex
    std::regex y_re("y+"); // this is the regex that matches y yyy or more yyyy

    // replacing
    std::string r1 = std::regex_replace(text, y_re, "%y"); // using lowercase
    std::string r2 = std::regex_replace(sentence, y_re, "%Y"); // using upercase 

    // showing result
    std::cout << "Text replace: " <<   r1 << std::endl;
    std::cout <<  "Sentence replace: " << r2 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Output:

Text: yyyyyy
Sentence: This is a yyyyyyyyyyyy.
Text replace: %y
Sentence replace: This is a %Y.
Run Code Online (Sandbox Code Playgroud)

If you want to make it even better you can use:

// Regex
std::regex y_re("[yY]+");
Run Code Online (Sandbox Code Playgroud)

That will match any mix of lowercase and upper case for any amount of 'Y's . Example output with that Regex:

Sentence: This is a yYyyyYYYYyyy.
Sentence replace: This is a %Y.
Run Code Online (Sandbox Code Playgroud)

This is just a simple example of what you can do with regex, I'd recommend to look at the topic on itself, there is plenty of info her in SO and other sites.

Extra: If you want to match before replacing to alternate the replacing you can do something like:

 // Regex
    std::string text = "yyaaaa";
    std::cout << "Text: " << text << std::endl;
    std::regex y_re("y+"); // this is the regex that matches y yyy or more yyyy


    std::string output = "";
    std::smatch ymatches;
    if (std::regex_search(text, ymatches, y_re)) {
        if (ymatches[0].length() == 2 ) {
            output = std::regex_replace(text, y_re, "%y");
        } else {
            output = std::regex_replace(text, y_re, "%Y");
        }
    }
Run Code Online (Sandbox Code Playgroud)