2011-07-27 5 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; 
} 

, 내가 ' meta의 초기화는 보어의 비트, 그리고 정확한 재향 군인입니다

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

: 뭔가를 반환하는 isMeta을 수정 거라고 luch 은 정규 표현식 (또는 심지어 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)")); 

이렇게하면 '$'와 (과) 같은 모든 특수 문자가 '\ $'로 바뀝니다.

관련 문제