我刚开始我周围的正则表达式的头,我使用了Boost regex库。
我有一个需要使用正则表达式包含特定URL,它扼流圈,因为明明有在URL中的字符保留给正则表达式,并需要进行转义。
有没有在Boost库的任何函数或方法来逃避这种用法的字符串? 我知道有其他大多数正则表达式实现这样的方法,但我没有看到一个在加速。
另外,有将需要转义所有字符的列表?
我刚开始我周围的正则表达式的头,我使用了Boost regex库。
我有一个需要使用正则表达式包含特定URL,它扼流圈,因为明明有在URL中的字符保留给正则表达式,并需要进行转义。
有没有在Boost库的任何函数或方法来逃避这种用法的字符串? 我知道有其他大多数正则表达式实现这样的方法,但我没有看到一个在加速。
另外,有将需要转义所有字符的列表?
. ^ $ | ( ) [ ] { } * + ? \
讽刺的是,你可以使用正则表达式来逃避你的网址,以便它可以插入一个正则表达式。
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);
从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
。
用相同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;
}
在C ++ 11,可以使用原始字符串字面量 ,以避免转义正则表达式的字符串:
std::string myRegex = R"(something\.com)";
见http://en.cppreference.com/w/cpp/language/string_literal ,(6)项。