如何转义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)。