替换C ++ 98中的模式

时间:2015-08-20 05:03:55

标签: c++ string std c++98

我需要在字符串中替换特定模式 示例:

输入:

temp.temp2..temp3....temp4......temp5

输出:

temp.temp2.temp3.temp4.temp5

所以基本上如果是单点,请保持原样,但如果有更多连续点,则用一个点替换它们。

我尝试迭代字符串并根据比较复制到另一个字符串对象,现在看起来真的很难看。 我想知道使用C ++ STL的更好方法吗?

3 个答案:

答案 0 :(得分:2)

如果你需要坚持使用C ++ 98,你可以使用boost regex。

#include <boost/regex.hpp>
#include <iostream>

int main()
{
    std::string str = "....";
    boost::regex re("\\.{2,}");
    std::cout << regex_replace(str, re, ".") << std::cout;
}

如果你不能使用boost,我想到的最简单的解决方案是:

#include <iostream>
#include <sstream>

using namespace std;

string replaceConsecutiveDots(const string& str) {
    std::stringstream ss;
    bool previousCharIsDot = false;
    for (string::const_iterator it = str.begin(); it!=str.end(); ++it) {
        char c = *it;
        if (c != '.' || !previousCharIsDot) {
            ss << c;
        }
        previousCharIsDot = c == '.';
    }
    return ss.str();
}

int main() {
    string str = "temp.temp2..temp3....temp4......temp5";
    cout << replaceConsecutiveDots(str) << endl;
}

答案 1 :(得分:1)

算法不应该长或丑。它应该简单而干净。

伪代码

from pos 0 to string.length -1
  do 
  if string[pos] is '.'
    if string[pos+1] is '.' 
       do 
        erase string[pos+1] while string[pos+1] is '.'  

真正的C ++示例:

void cleanStringDots(string& str){
    for (int i=0;i<str.size()-1;i++){
      if (str[i] == '.' && str[i+1] == '.'){
           size_t count = 1;
           for (int j = i+2; j<str.size() && str[j] =='.';j++){
               if (str[j]=='.') {
                  count++; 
                  }  
             }
             str.erase(i+1,count);
        }
    }    
}

int main(){
  string str = "temp.temp2..temp3....temp4......temp5";
  cleanStringDots(str);
  cout<<str;
}

可以在这里运行:http://coliru.stacked-crooked.com/a/aa6923d4049a1fdd

答案 2 :(得分:1)

这是一项微不足道的任务。

std::string convert(const std::string& src) {
    std::string dst;
    for (std::string::size_type i = 0; i < src.size(); ++i) {
        if (src[i] == '.' && dst.size() && dst[dst.size() - 1] == '.') continue;
        dst.push_back(src[i]);
    }
    return dst;
}

使用C ++ 11,您可以将丑陋的dst[dst.size() - 1]替换为dst.back()