zoukankan      html  css  js  c++  java
  • 字符串替换(C++)

    用过python的朋友应该知道,python的string中有个replace函数,其功能是实现字符串的替换,默认情况下是替换所有,如果加入参数的话会根据设定的个数进行替换,比如下面的例子:

    >>> import string

    >>> str1 = "ab1ab2ab3ab4"

    >>> print string.replace(str1,"ab","cd")

    cd1cd2cd3cd4

    >>> print string.replace(str1,"ab","cd",1)

    cd1ab2ab3ab4

    >>> print string.replace(str1,"ab","cd",2)

    cd1cd2ab3ab4

    >>>

    c++中,我也想这么用……暂时还没找到现成的,就自己写了个。

    这里贴出来函数的代码,也方便我以后使用:

    string m_replace(string str,string pattern,string dstPattern,int count=-1)
    {
        string retStr="";
        string::size_type pos;
        int i=0,l_count=0,szStr=str.length();
        if(-1 == count) // replace all
            count = szStr;
        for(i=0; i<szStr; i++)
        {        
            if(string::npos == (pos=str.find(pattern,i)))  break;
            if(pos < szStr)
            {            
                retStr += str.substr(i,pos-i) + dstPattern;
                i=pos+pattern.length()-1;
                if(++l_count >= count)
                {
                    i++;
                    break;
                }
            }
        }
        retStr += str.substr(i);
        return retStr;
    }

    补充:

    当时我认为STL的replace函数不能进行不同长度的替换(现在证明是错的),所以就没用……

    这里有用STL的replace函数的实现:

    View Code
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    string m_replace(string strSrc,
                     const string &oldStr, const string &newStr,int count=-1)
    {
        string strRet=strSrc;
        size_t pos = 0;
        int l_count=0;
        if(-1 == count) // replace all
            count = strRet.size();
        while ((pos = strRet.find(oldStr, pos)) != string::npos)
        {
            strRet.replace(pos, oldStr.size(), newStr);
            if(++l_count >= count) break;
            pos += newStr.size();
        }
        return strRet;
    }
    
    int main()
    {
        string str1="ab1ab2ab3";
        string str2="ab";
        string str3="cd";
        string str4="cdefgh";
    
        cout<<m_replace(str1,str2,str3)<<endl;
        cout<<m_replace(str1,str2,str3,1)<<endl;
        cout<<m_replace(str1,str2,str4)<<endl;
        cout<<m_replace(str1,str2,str4,2)<<endl;
    
    }
  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
查看全文
  • 相关阅读:
    LeetCode -- Rectangle Area
    【转】VS常用快捷键
    C++中include<> 与 include" " 的区别
    浅析_tmain() 与 main() 函数的区别
    VS2013下配置OpenCV 3.0.0 &&& VS2013下配置Opencv2.4.9
    LeetCode -- Valid Parenthese
    杂想 · 警醒
    LeetCode -- Length of Last Word
    LeetCode -- Valid Sudoku
    LeetCode -- Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/cppReplaceFunction20120922.html
  • Copyright © 2011-2022 走看看