如何替换字符串中出现的所有字符?

用<code>std::string另一个字符替换所有出现的字符的有效方法是什么?


#1楼

我以为我也会在增强解决方案中投入:

#include <boost/algorithm/string/replace.hpp>

// in place
std::string in_place = "blah#blah";
boost::replace_all(in_place, "#", "@");

// copy
const std::string input = "blah#blah";
std::string output = boost::replace_all_copy(input, "#", "@");

#2楼

问题集中在character替换上,但是,由于我发现这个页面非常有用(特别是Konrad的评论),我想分享这个更通用的实现,它允许处理substrings

std::string ReplaceAll(std::string str, const std::string& from, const std::string& to) {
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
    }
    return str;
}

用法:

std::cout << ReplaceAll(string("Number Of Beans"), std::string(" "), std::string("_")) << std::endl;
std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("X")) << std::endl;
std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("h")) << std::endl;

输出:

Number_Of_Beans

XXjXugtXty

hhjhugthty


编辑:

上面的内容可以用更合适的方式实现,如果您需要关注性能,则不返回任何内容( void )并直接对作为参数给出的字符串str执行更改,通过地址而不是传递。 这将避免原始字符串的无用且昂贵的副本,同时返回结果。 你的电话,然后......

代码:

static inline void ReplaceAll2(std::string &str, const std::string& from, const std::string& to)
{
    // Same inner code...
    // No return statement
}

希望这对其他人有帮助......


#3楼

#include <iostream>
#include <string>
using namespace std;
// Replace function..
string replace(string word, string target, string replacement){
    int len, loop=0;
    string nword="", let;
    len=word.length();
    len--;
    while(loop<=len){
        let=word.substr(loop, 1);
        if(let==target){
            nword=nword+replacement;
        }else{
            nword=nword+let;
        }
        loop++;
    }
    return nword;

}
//Main..
int main() {
  string word;
  cout<<"Enter Word: ";
  cin>>word;
  cout<<replace(word, "x", "y")<<endl;
  return 0;
}

#4楼

std::string不包含此类函数,但您可以使用algorithm标头中的独立replace函数。

#include <algorithm>
#include <string>

void some_func() {
  std::string s = "example string";
  std::replace( s.begin(), s.end(), 'x', 'y'); // replace all 'x' to 'y'
}

#5楼

正如Kirill建议的那样,要么使用replace方法,要么沿着字符串迭代,独立地替换每个char。

或者,您可以使用find方法或find_first_of具体取决于您需要执行的操作。 这些解决方案都不能一次性完成这项工作,但只需要几行代码就可以让它们为您工作。 :-)


#6楼

对单个字符的简单查找和替换将类似于:

s.replace(s.find("x"), 1, "y")

要对整个字符串执行此操作,最简单的方法是循环,直到s.find开始返回npos 。 我想你也可以捕获range_error来退出循环,但这有点难看。


#7楼

想象一个大的二进制blob,其中所有0x00字节将由“\\ 1 \\ x30”替换,所有0x01字节由“\\ 1 \\ x31”替换,因为传输协议不允许\\ 0-bytes。

如果:

  • 替换和替换字符串有不同的长度,
  • 源字符串中有很多被替换字符串的出现
  • 源字符串很大,

提供的解决方案无法应用(因为它们只替换单个字符)或存在性能问题,因为它们会多次调用string :: replace,这会反复生成blob大小的副本。 (我不知道增强解决方案,从这个角度来看也许没问题)

这一个沿源字符串中所有出现的散步和建立一块新的字符串件一次

void replaceAll(std::string& source, const std::string& from, const std::string& to)
{
    std::string newString;
    newString.reserve(source.length());  // avoids a few memory allocations

    std::string::size_type lastPos = 0;
    std::string::size_type findPos;

    while(std::string::npos != (findPos = source.find(from, lastPos)))
    {
        newString.append(source, lastPos, findPos - lastPos);
        newString += to;
        lastPos = findPos + from.length();
    }

    // Care for the rest after last occurrence
    newString += source.substr(lastPos);

    source.swap(newString);
}

#8楼

如果你想要替换多个单个字符,并且只处理std::string ,那么这个代码片段就可以了,用sReplace替换sHaystack中的sNeedle,sNeedle和sReplace不需要大小相同。 此例程使用while循环替换所有出现,而不是仅从左到右找到的第一个出现。

while(sHaystack.find(sNeedle) != std::string::npos) {
  sHaystack.replace(sHaystack.find(sNeedle),sNeedle.size(),sReplace);
}

#9楼

这有效! 我在书店应用程序中使用了类似的东西,其中库存存储在CSV(如.dat文件)中。 但是在单个字符的情况下,意味着替换者只是一个字符,例如“|”,它必须是双引号“|” 为了不抛出无效的转换const char。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int count = 0;  // for the number of occurences.
    // final hold variable of corrected word up to the npos=j
    string holdWord = "";
    // a temp var in order to replace 0 to new npos
    string holdTemp = "";
    // a csv for a an entry in a book store
    string holdLetter = "Big Java 7th Ed,Horstman,978-1118431115,99.85";

    // j = npos
    for (int j = 0; j < holdLetter.length(); j++) {

        if (holdLetter[j] == ',') {

            if ( count == 0 ) 
            {           
                holdWord = holdLetter.replace(j, 1, " | ");      
            }
            else {

                string holdTemp1 = holdLetter.replace(j, 1, " | ");

                // since replacement is three positions in length,
                // must replace new replacement's 0 to npos-3, with
                // the 0 to npos - 3 of the old replacement 
                holdTemp = holdTemp1.replace(0, j-3, holdWord, 0, j-3); 

                holdWord = "";

                holdWord = holdTemp;

            }
            holdTemp = "";
            count++;
        }
    } 
    cout << holdWord << endl;
    return 0;
}

// result:
Big Java 7th Ed | Horstman | 978-1118431115 | 99.85

不习惯我目前正在使用CentOS,所以我的编译器版本如下。 C ++版(g ++),C ++ 98默认:

g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#10楼

如果您愿意使用std::string ,则可以按strsub使用此sample-app的strsub函数,或者如果您希望它采用不同类型或参数集来实现大致相同的目标,则更新它。 基本上,它使用std::string的属性和功能来快速擦除匹配的字符集,并直接在std::string插入所需的字符。 每次执行此替换操作时,如果仍然可以找到要替换的匹配字符,则偏移量会更新,如果由于无需更换而无法更新,则返回上次更新时其状态的字符串。

#include <iostream>
#include <string>

std::string strsub(std::string stringToModify,
                   std::string charsToReplace,
                   std::string replacementChars);

int main()
{
    std::string silly_typos = "annoiiyyyng syyyllii tiipos.";

    std::cout << "Look at these " << silly_typos << std::endl;
    silly_typos = strsub(silly_typos, "yyy", "i");
    std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl;
    silly_typos = strsub(silly_typos, "ii", "y");

    std::cout << "There, no more " << silly_typos << std::endl;
    return 0;
}

std::string strsub(std::string stringToModify,
                   std::string charsToReplace,
                   std::string replacementChars)
{
    std::string this_string = stringToModify;

    std::size_t this_occurrence = this_string.find(charsToReplace);
    while (this_occurrence != std::string::npos)
    {
        this_string.erase(this_occurrence, charsToReplace.size());
        this_string.insert(this_occurrence, replacementChars);
        this_occurrence = this_string.find(charsToReplace,
                                           this_occurrence + replacementChars.size());
    }

    return this_string;
}

如果您不想依赖于使用std::string s作为参数,那么您可以传入C风格的字符串,您可以在下面看到更新的示例:

#include <iostream>
#include <string>

std::string strsub(const char * stringToModify,
                   const char * charsToReplace,
                   const char * replacementChars,
                   uint64_t sizeOfCharsToReplace,
                   uint64_t sizeOfReplacementChars);

int main()
{
    std::string silly_typos = "annoiiyyyng syyyllii tiipos.";

    std::cout << "Look at these " << silly_typos << std::endl;
    silly_typos = strsub(silly_typos.c_str(), "yyy", "i", 3, 1);
    std::cout << "After a little elbow-grease, a few less " << silly_typos << std::endl;
    silly_typos = strsub(silly_typos.c_str(), "ii", "y", 2, 1);

    std::cout << "There, no more " << silly_typos << std::endl;
    return 0;
}

std::string strsub(const char * stringToModify,
                   const char * charsToReplace,
                   const char * replacementChars,
                   uint64_t sizeOfCharsToReplace,
                   uint64_t sizeOfReplacementChars)
{
    std::string this_string = stringToModify;

    std::size_t this_occurrence = this_string.find(charsToReplace);
    while (this_occurrence != std::string::npos)
    {
        this_string.erase(this_occurrence, sizeOfCharsToReplace);
        this_string.insert(this_occurrence, replacementChars);
        this_occurrence = this_string.find(charsToReplace,
            this_occurrence + sizeOfReplacementChars);
    }

    return this_string;
}

#11楼

对于简单的情况,这可以很好地工作,而不使用任何其他库然后std :: string(已经在使用中)。

some_string中的字符b替换所有出现的字符a

for (size_t i = 0; i < some_string.size(); ++i) {
    if (some_string[i] == 'a') {
        some_string.replace(i, 1, "b");
    }
}

如果字符串很大或多次调用替换是一个问题,您可以应用此答案中提到的技术: https//stackoverflow.com/a/29752943/3622300


#12楼

老套 :-)

std::string str = "H:/recursos/audio/youtube/libre/falta/"; 

for (int i = 0; i < str.size(); i++) {
    if (str[i] == '/') {
        str[i] = '\\';
    }
}

std::cout << str;

结果:

H:\\ RECURSOS \\音频\\的YouTube \\自由报\\尔他\\

发布了0 篇原创文章 · 获赞 2 · 访问量 7502

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/104092212