我如何查找和替换(匹配整个单词)。 我有这个。
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");
它仍将取代,但我希望它能匹配整个单词。
答案 0 :(得分:1)
您只是盲目地将search
的{{1}}替换为replace
,而不会在执行替换之前检查它们是否为完整字词。
以下是您可以尝试解决的一些问题:
search
检查每个字词,并在必要时替换。然后重建字符串。pos-1
和pos + 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))([^,. ]*)
,
,.
或
(空格)以外的任何内容。以上基本上只是扯掉了example provided here。答案是区分大小写的,并且还会替换^
之后列出的三个标点以外的标点符号,但随时可以了解有关正则表达式的更多信息,以便制定更一般的解决方案。