2011-07-27 9 views
3

std::wstringを正規表現で使用するために任意のエスケープ方法を教えてください。たとえば、you owe me $you owe me \$に変換しますか?文字列を正規表現のリテラルに変換する方法

私のシナリオ:単語全体を検索するのにstd::tr1::wregexを使いたいです。だから私のような何かやりたい:私はそれが賢いか、最も効率的だということを知らない

std::wstring RegexEscape(const std::wstring& inp) 
{ 
    return ????? 
} 

bool ContainsWholeWord(const std::wstring& phrase, const std::wstring& word) 
{ 
    std::tr1::wregex regex(std::wstring(L"\\b") + RegexEscape(word) + L"\\b"); 
    return std::tr1::regex_match(phrase, regex); 
} 

答えて

1

を、私は次のよう なものを使用します。wchar_tについては

namespace { 
bool 
isMeta(char ch) 
{ 
    static bool const meta[UCHAR_MAX] = 
    { 
     // ... 
    }; 
    return meta[static_cast<unsigned char>(ch)]; 
} 

std::string 
sanitizeForRegEx(std::string const& original) 
{ 
    std::string result; 
    for (std::string::const_iterator iter = original.begin(); 
      iter != original.end(); 
      ++ iter) { 
     if (isMeta(*iter)) { 
      result += '\\'; 
     result += *iter; 
    } 
    return result; 
} 

、私は」

return ch >= 0 && ch < 128 && meta[ ch ]; 

metaの初期化は、ボアのビットで、かつ正確なVA:Dのようなものを返すようにisMetaを変更 は、使用される正規表現(あるいは、 boost::regexが使用されている場合のオプションさえ)に依存します。

0

これは非常に簡単です!そのために正規表現を使用してください!

std::wstring szTmp; // some string with $, (, ... 
std::wregex rgx_Meta(LR"(([\^\$\\\.\*\+\?\(\)\[\]\{\}\|]))"); 
std::wstring strEscaped(std::regex_replace(szTmp, rgx_Meta, LR"(\$1)")); 

これは、 '$'のようなすべての特殊文字を '\ $'に置き換えます。

関連する問題