2016-11-22 171 views
-2

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

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(); 
    } 
} 

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

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

它仍然会取代,但我希望它全字匹配。

+4

真的吗?你不能先搜索?今天发布了三个相关问题。我强烈建议与你的同学谈谈。 –

+2

[用另一个字符串替换字符串的一部分]可能的重复(http://stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string) – Hcorg

+0

@Hcorg看着那个,它看起来像是这个作者写了完全相同的功能,或者已经尝试过那个(因为这两个样本在功能上是相同的,只有不同的参数名称)。 – lcs

回答

1

你只是盲目地将search的任何实例替换为replace而不检查在执行替换之前它们是否是全部单词。

这里只是一对夫妇的事情,你可以尝试解决的是:

  • 分割字符串为单个单词,然后检查每个单词对search,并在必要时更换。然后重建该字符串。
  • 只有在pos-1pos + search.length() + 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。答案是区分大小写的,并且还将替换^之后列出的三个之外的标点符号,但请随时了解有关正则表达式的更多信息以制定更一般的解决方案。