如何转义string在Boost Regex中使用
我只是绕过正则expression式,而我正在使用Boost Regex库。
我有一个需要使用正则expression式,包括一个特定的url,它扼stream圈,因为显然是在URL中保留为正则expression式,需要转义的字符。
在Boost库中是否有任何函数或方法为这种用法转义string? 我知道在其他大多数正则expression式实现中都有这样的方法,但是在Boost中我没有看到这样的方法。
或者,是否有需要转义的所有字符的列表?
. ^ $ | ( ) [ ] { } * + ? \
具有讽刺意味的是,你可以使用正则expression式来逃避你的URL,以便它可以插入正则expression式。
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的replacestring格式。在sed中,escape &
将输出与整个expression式匹配的任何内容)
或者,如果您对sed的replacestring格式不满意,只需将标志更改为boost::format_perl
,您可以使用熟悉的$&
来引用与整个expression式匹配的任何内容。
const std::string rep("\\\\$&"); std::string result = regex_replace(url_to_escape, esc, rep, boost::match_default | boost::format_perl);
使用Dav的代码(+注释修复),我创build了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中,可以使用原始string文字来避免转义正则expression式string:
std::string myRegex = R"(something\.com)";
参见http://en.cppreference.com/w/cpp/language/string_literal ,项目(6)。