How to escape a string for use in Boost Regex

前端 未结 4 1779
粉色の甜心
粉色の甜心 2020-11-27 17:21

I\'m just getting my head around regular expressions, and I\'m using the Boost Regex library.

I have a need to use a regex that includes a specific URL, and it choke

相关标签:
4条回答
  • 2020-11-27 17:30

    In C++11, you can use raw string literals to avoid escaping the regex string:

    std::string myRegex = R"(something\.com)";

    See http://en.cppreference.com/w/cpp/language/string_literal, item (6).

    0 讨论(0)
  • 2020-11-27 17:33
    . ^ $ | ( ) [ ] { } * + ? \
    

    Ironically, you could use a regex to escape your URL so that it can be inserted into a regex.

    const boost::regex esc("[.^$|()\\[\\]{}*+?\\\\]");
    const std::string rep("\\\\&");
    std::string result = regex_replace(url_to_escape, esc, rep,
                                       boost::match_default | boost::format_sed);
    

    (The flag boost::format_sed specifies to use the replacement string format of sed. In sed, an escape & will output whatever matched by the whole expression)

    Or if you are not comfortable with sed's replacement string format, just change the flag to boost::format_perl, and you can use the familiar $& to refer to whatever matched by the whole expression.

    const std::string rep("\\\\$&");
    std::string result = regex_replace(url_to_escape, esc, rep,
                                       boost::match_default | boost::format_perl);
    
    0 讨论(0)
  • 2020-11-27 17:42

    Using code from Dav (+ a fix from comments), I created ASCII/Unicode function regex_escape():

    std::wstring regex_escape(const std::wstring& string_to_escape) {
        static const boost::wregex re_boostRegexEscape( _T("[.^$|()\\[\\]{}*+?\\\\]") );
        const std::wstring rep( _T("\\\\&") );
        std::wstring result = regex_replace(string_to_escape, re_boostRegexEscape, rep, boost::match_default | boost::format_sed);
        return result;
    }
    

    For ASCII version, use std::string/boost::regex instead of std::wstring/boost::wregex.

    0 讨论(0)
  • 2020-11-27 17:49

    Same with boost::xpressive:

    const boost::xpressive::sregex re_escape_text = boost::xpressive::sregex::compile("([\\^\\.\\$\\|\\(\\)\\[\\]\\*\\+\\?\\/\\\\])");
    
    std::string regex_escape(std::string text){
        text = boost::xpressive::regex_replace( text, re_escape_text, std::string("\\$1") );
        return text;
    }
    
    0 讨论(0)
提交回复
热议问题