我想删除句子中的特定单词,并且我尝试将这些句子分解为单词并比较单词,但是当我调用擦除功能时,索引将更新。我尝试了另一种方法,但是它将删除我不想删除的单词中的子字符串。谁能帮我一下吗?我应该使用什么方法。
输入
房子旋转了两到三圈,然后在空中慢慢升起。
输出
这房子旋转了大约两三遍,然后在空中慢慢升起。
这是我的函数原型
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;
// ==========================
}
答案 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, "");
}