如何逃脱的升压正则表达式中使用的字符串(How to escape a string for use

2019-06-18 06:18发布

我刚开始我周围的正则表达式的头,我使用了Boost regex库。

我有一个需要使用正则表达式包含特定URL,它扼流圈,因为明明有在URL中的字符保留给正则表达式,并需要进行转义。

有没有在Boost库的任何函数或方法来逃避这种用法的字符串? 我知道有其他大多数正则表达式实现这样的方法,但我没有看到一个在加速。

另外,有将需要转义所有字符的列表?

Answer 1:

. ^ $ | ( ) [ ] { } * + ? \

讽刺的是,你可以使用正则表达式来逃避你的网址,以便它可以插入一个正则表达式。

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

(该标志boost::format_sed指定使用的sed。在sed,逃逸的替换字符串格式&将任何由整个表达式匹配的输出)

或者,如果你不舒服的sed的替换字符串格式,只需更改标志boost::format_perl ,你可以使用熟悉的$&指任何由整个表达式匹配。

const std::string rep("\\\\$&");
std::string result = regex_replace(url_to_escape, esc, rep,
                                   boost::match_default | boost::format_perl);


Answer 2:

从DAV(+从评论的修复)使用的代码,我创建ASCII / Unicode的功能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;
}

对于ASCII版本,使用std::string / boost::regex ,而不是std::wstring / boost::wregex



Answer 3:

用相同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;
}


Answer 4:

在C ++ 11,可以使用原始字符串字面量 ,以避免转义正则表达式的字符串:

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

见http://en.cppreference.com/w/cpp/language/string_literal ,(6)项。



文章来源: How to escape a string for use in Boost Regex