如何删除句子中的整个单词C ++

时间:2019-03-28 08:59:52

标签: c++

我想删除句子中的特定单词,并且我尝试将这些句子分解为单词并比较单词,但是当我调用擦除功能时,索引将更新。我尝试了另一种方法,但是它将删除我不想删除的单词中的子字符串。谁能帮我一下吗?我应该使用什么方法。

输入

  

房子旋转了两到三圈,然后在空中慢慢升起。

输出

  

这房子旋转了大约两三遍,然后在空中慢慢升起。

这是我的函数原型

int RemoveWordFromLine(string line, string word)
{
  // ==========================
  string tmp_str="",spacebar=" ";
  int start=0,end=-1;
  for(int i=0;i<line.length();i++)
  {

    if(isspace(line[i])||int(line[i])==44||int(line[i])==46)
    {
      cout<<tmp_str<<" "<<start<<" "<<end<<endl; // compare
      if(tmp_str==word)
      {
        line.erase(start,end);  
      }
      tmp_str="";
      start=i+1;
      end=i;

    } else
    {
      tmp_str+=line[i];
      end++;

    }

  }
    if(tmp_str==word)
      {
        line.erase(start,end);  
      }
    cout<<tmp_str<<" "<<start<<" "<<end<<endl; // compare
    cout<<line<<endl;


  // ==========================
}

ideone's link

4 个答案:

答案 0 :(得分:0)

您可以通过以下方式编写函数:

void RemoveWordFromLine(std::string &line, const std::string &word)
{
  auto n = line.find(word);
  if (n != std::string::npos)
  {
    line.erase(n, word.length());
  }
}

并像这样使用它:

std::string line("This is a wrong line");
RemoveWordFromLine(line, "wrong");
printf("line is: '%s'\n", line.c_str());

打印出:

  

一行是:“这是一行”

答案 1 :(得分:0)

您正在传递结束位置,而不是要删除的字符串长度。 您只需要替换

 if(tmp_str==word)
      {
        line.erase(start,end);  
      }

 if(tmp_str==word)
      {
        line.erase(start,word.length()+1);  //+1 to prevent 2 spaces
      }

如果您想保留'。',也可以执行line.erase(start-1,word.length()+1);。或“,”(已删除单词后)。

答案 2 :(得分:0)

使用此功能还可以删除多个匹配项

1000/32

答案 3 :(得分:0)

使用<regex>,您可以这样做:

std::string RemoveWordFromLine(const std::string& line, std::string word)
{
    // \s* : extra optional spaces at the start
    // \b : word boundary
    // Ideally, we should check that `word` doesn't break regex too:
    std::regex reg("\\s*\\b" + word + "\\b");
    return std::regex_replace(line, reg, "");
}

Demo