c ++查找并替换整个单词

时间:2016-11-22 21:31:31

标签: c++ replace find

我如何查找和替换(匹配整个单词)。 我有这个。

  void ReplaceString(std::string &subject, const std::string& search, const std::string& replace)
   {
    size_t pos = 0;
    while ((pos = subject.find(search, pos)) != std::string::npos) {
        subject.replace(pos, search.length(), replace);
        pos += replace.length();
    }
}

但它搜索整个单词。 例如,如果我尝试

string test = "i like cake";
ReplaceString(test, "cak", "notcake");

它仍将取代,但我希望它能匹配整个单词。

2 个答案:

答案 0 :(得分:1)

您只是盲目地将search的{​​{1}}替换为replace,而不会在执行替换之前检查它们是否为完整字词。

以下是您可以尝试解决的一些问题:

  • 将字符串拆分为单个字词,然后针对search检查每个字词,并在必要时替换。然后重建字符串。
  • 仅当pos-1pos + search.length() + 1都是空格时才替换。

答案 1 :(得分:-1)

正则表达式解决方案,如果您有权访问c ++ 11编译器:

#include <iostream>
#include <string>
#include <regex>

void ReplaceString(std::string &subject, const std::string& search, const std::string& replace)
{
    // Regular expression to match words beginning with 'search'
    std::regex e ("(\\b("+search+"))([^,. ]*)");
    subject = std::regex_replace(subject,e,replace) ;
}

int main ()
{
  // String to search within and do replacement
  std::string s ("Cakemoney, cak, cake, thecakeisalie, cake.\n");
  // String you want to find and replace
  std::string find ("cak") ;
  // String you want to replace with
  std::string replace("notcake") ;

  ReplaceString(s, find, replace) ;

  std::cout << s << std::endl;

  return 0 ;
}

输出:     Cakemoney,notcake,notcake,thecakeisalie,notcake。

有关正则表达式字符串(\\b("+search+"))([^,. ]*)的更多信息。请注意,在替换search后,此字符串将为: (\\b(cak))([^,. ]*)

  • \ b(cak) - 匹配以cak开头的单词,无论后来发生什么,
  • ([^,。] *) - 匹配,.(空格)以外的任何内容。

以上基本上只是扯掉了example provided here。答案是区分大小写的,并且还会替换^之后列出的三个标点以外的标点符号,但随时可以了解有关正则表达式的更多信息,以便制定更一般的解决方案。