C ++字符替换

时间:2009-11-30 15:13:46

标签: c++ regex string boost

替换字符串中字符的最佳方法是什么?

具体做法是:

"This,Is A|Test" ----> "This_Is_A_Test"

我想替换所有逗号,空格和“|”带有下划线。

(我可以访问Boost。)

7 个答案:

答案 0 :(得分:16)

你可以使用标准的replace_if算法,除了谓词相当复杂(用当前的C ++标准表示并且没有lambda)。

你可以编写自己的,或者使用boost的字符串算法中的is_any_of,所以:

#include <algorithm>
#include <string>
#include <boost/algorithm/string/classification.hpp>
#include <iostream>

int main()
{
    std::string s("This,Is A|Test");
    std::replace_if(s.begin(), s.end(), boost::is_any_of(", |"), '_');
    std::cout << s << '\n';
}

答案 1 :(得分:11)

您可以使用STL算法replace_if

答案 2 :(得分:9)

如其他答案所示,您可以使用各种replace方法。但是,这些方法有多次扫描字符串的缺点(每个字符一次)。如果你关心速度,我建议你推荐自己的替换方法:

void beautify(std::string &s) {
    int i;
    for (i = 0; i < s.length(); ++i) {
        switch (s[i]) {
        case ' ':
        case ',':
        case '|':
            s[i] = '_';
        }
    }
}

答案 3 :(得分:3)

编辑:正如Space_C0wb0y所说,replace_if肯定更好。这是一些simpler示例代码:

#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

bool isBad(char c)
{
 const string bad_chars = "|, ";
 return (bad_chars.find(c) != string::npos);
}

int main()
{
 string str = "This,Is A|Test";

 // Replace!
 replace_if(str.begin(),str.end(),isBad,'_');

 cout<<str<<endl; 
 return 0;
}

OLD ANSWER:

std::replacestd::find_first_of

一起使用

答案 4 :(得分:2)

boost :: replace_all(s,old,new);

答案 5 :(得分:0)

C ++标准库也可以访问这些函数,而无需使用BOOST。请参阅replace C++ Reference。这是最好的方法吗?我想这取决于讨论。要替换多个/不同的字符,您可能需要多次调用replace。

#include <string>
    string& replace( size_type index, size_type num, const string& str );
    string& replace( size_type index1, size_type num1, const string& str, size_type index2, size_type num2 );
    string& replace( size_type index, size_type num, const Char* str );
    string& replace( size_type index, size_type num1, const Char* str, size_type num2 );
    string& replace( size_type index, size_type num1, size_type num2, Char ch);

    string& replace( iterator start, iterator end, const string& str );
    string& replace( iterator start, iterator end, const Char* str );
    string& replace( iterator start, iterator end, const Char* str, size_type num );
    string& replace( iterator start, iterator end, size_type num, Char ch );
    string& replace( iterator start, iterator end, input_iterator start2, input_iterator end2 );

Example program

// replacing in a string
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string base="this is a test string.";
  string str2="n example";
  string str3="sample phrase";
  string str4="useful.";

  // function versions used in the same order as described above:

  // Using positions:                 0123456789*123456789*12345
  string str=base;                // "this is a test string."
  str.replace(9,5,str2);          // "this is an example string."
  str.replace(19,6,str3,7,6);     // "this is an example phrase."
  str.replace(8,10,"just all",6); // "this is just a phrase."
  str.replace(8,6,"a short");     // "this is a short phrase."
  str.replace(22,1,3,'!');        // "this is a short phrase!!!"

  // Using iterators:                      0123456789*123456789*
  string::iterator it = str.begin();   //  ^
  str.replace(it,str.end()-3,str3);    // "sample phrase!!!"
  str.replace(it,it+6,"replace it",7); // "replace phrase!!!"
  it+=8;                               //          ^
  str.replace(it,it+6,"is cool");      // "replace is cool!!!"
  str.replace(it+4,str.end()-4,4,'o'); // "replace is cooool!!!"
  it+=3;                               //             ^
  str.replace(it,str.end(),str4.begin(),str4.end());
                                       // "replace is useful."
  cout << str << endl;
  return 0;
}

答案 6 :(得分:0)

我正在写这篇文章,当Space_C0wb0y发布了他的回答时,这是你问题的正确答案。这有点复杂,但处理更多可能的替换。

(抱歉,未编译/测试)

class MyReplacer
{
  friend std::ostream& operator<<(std::ostream& os, const MyReplacer& Repl);
  public:
    MyReplacer(char c) : ch(c) {}
  private:
    char ch;
};

std::ostream& operator<<(std::ostream& os, const MyReplacer& Repl)
{
  switch (Repl.ch)
  {
    case '|':
    case ' ':
    case ',': os << '_'; break;
    default: os << Repl.ch;
  }
  return os;
}


std::ostringstream oss;
std::copy(str.begin(), str.end(), std::ostream_iterator<MyReplacer>(oss));
std::string result = oss.str();