如何将字符串转换为正则表达式字面量

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);
}
2个回答

1

我不知道这是否是最聪明或最有效的方法,但我使用类似以下的东西:

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的初始化有点乏味,确切的值取决于使用的正则表达式(甚至是选项,如果使用boost::regex)。


1
很简单!只需使用正则表达式即可!
std::wstring szTmp; // some string with $, (, ...
std::wregex rgx_Meta( LR"(([\^\$\\\.\*\+\?\(\)\[\]\{\}\|]))" );
std::wstring strEscaped( std::regex_replace( szTmp, rgx_Meta, LR"(\$1)" ) );

这将替换所有特殊字符,如'$'为'\$'。

好主意,但我们应该在代码中添加额外的斜杠,如下所示。std :: wstring szTmp(L“x:\”); std :: wregex rgx_Meta(L“(([\^\$\\\.\*\+\?\(\)\[\]\{\}\|]))”); std :: wstring strEscaped(std :: regex_replace(szTmp,rgx_Meta,L“\ $ 1”)); - Jun Ge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接