2016-11-22 4 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

Вы просто слепо заменяете любые экземпляры searchreplace, не проверяя, являются ли они полными словами перед выполнением замены.

Вот только несколько вещей, которые вы можете попробовать работать вокруг этого:

  • Разделить строку на отдельные слова, а затем проверить каждое слово против search, и при необходимости заменить. Затем перестройте строку.
  • Заменить, только если pos-1 и pos + 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))([^,. ]*)

  • \ б (САК) - соответствие слова, начинающиеся с САК независимо от того, что происходит после того, как
  • ([^ ,.] *) - соответствует любому до a ,, ., или (пробел).

Вышеупомянутое в основном просто срывает example provided here. Ответ чувствителен к регистру, а также заменяет знаки препинания, отличные от трех, перечисленных после ^, но не стесняйтесь больше узнать о регулярных выражениях, чтобы сделать более общее решение.