Как преобразовать строку в регулярное выражение - PullRequest
3 голосов
/ 27 июля 2011

Каков наилучший способ избежать произвольного 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);
}

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Я не знаю, что это самый умный или самый эффективный, но я использую что-то вроде следующего:

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;
}

Для wchar_t я бы изменил isMeta, чтобы вернуть что-то вроде:

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

Инициализация meta немного скучна, и точные значения зависят от используемых регулярных выражений (или даже параметров, если используется boost::regex).

0 голосов
/ 11 июля 2017

Ну, это довольно просто! Просто используйте для этого регулярное выражение!

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

Это заменит все специальные символы, такие как '$', на '\ $'.

...