我只是关注正则表达式,我正在使用Boost Regex库。
我需要使用包含特定URL的正则表达式,并且它会发生窒息,因为显然URL中有为正则表达式保留的字符,需要进行转义。
Boost库中是否有任何函数或方法来转义字符串以进行此类用法?我知道在大多数其他正则表达式实现中都有这样的方法,但我没有在Boost中看到它。
或者,是否有需要转义的所有字符的列表?
答案 0 :(得分:38)
. ^ $ | ( ) [ ] { } * + ? \
具有讽刺意味的是,您可以使用正则表达式来转义URL,以便将其插入到正则表达式中。
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);
答案 1 :(得分:13)
使用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
。
答案 2 :(得分:4)
与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;
}
答案 3 :(得分:2)
在C ++ 11中,您可以使用原始字符串文字来避免转义正则表达式字符串:
std::string myRegex = R"(something\.com)";
见http://en.cppreference.com/w/cpp/language/string_literal,第(6)项。