【问题标题】:How to convert string to regex literal如何将字符串转换为正则表达式文字
【发布时间】:2011-07-27 14:57:38
【问题描述】:

转义任意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);
}

【问题讨论】:

    标签: c++ regex tr1


    【解决方案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;
    }
    

    对于wchar_t,我会修改isMeta 以返回类似:

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

    meta 的初始化有点无聊,具体数值 取决于使用的正则表达式(甚至是选项,如果 使用boost::regex)。

    【讨论】:

      【解决方案2】:

      嗯,这很简单!只需使用正则表达式即可!

      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"));
      猜你喜欢
      • 2012-01-28
      • 2022-11-18
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2015-09-09
      • 2021-08-05
      相关资源
      最近更新 更多