2016-11-22 17 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(); 
    } 
} 

ですが、単語全体を検索します。私は

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

をしようとした場合例えば それはまだ置き換えられますが、私はそれが単語全体をマッチさせたいです。

+4

本当に?最初に検索できませんでしたか?今日、3つの関連する質問がありました。私はあなたのクラスメートと話すことを強く勧めます。 –

+2

[文字列の一部を別の文字列に置き換える](http://stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string) – Hcorg

+0

@Hcorgを見て、この作者がまったく同じ機能を書いているか、すでにそれを試してみたようです(2つのサンプルが機能的に同一で、異なるパラメータ名のみを持つ)。 – 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+"))([^,. ]*)。 CAKで始まるマッチ言葉にかかわらず

  • 後に来るものの([^ ,.] *) - - まで何でもマッチする (\\b(cak))([^,. ]*)

    • B(CAK)\:この文字列searchを交換した後になることに注意してください,,.または(空白)です。

    上記は基本的にexample provided hereから外れています。答えは大文字と小文字が区別され、^の後にリストされた3つ以外の句読点も置き換えられますが、より一般的な解決方法を学ぶために正規表現の詳細を自由に感じてください。

  • 関連する問題