Cómo escapar de una cadena para usar en Boost Regex

Solo estoy entendiendo las expresiones regulares, y estoy usando la biblioteca Boost Regex.

Tengo la necesidad de usar una expresión regular que incluye una URL específica, y se bloquea porque, obviamente, hay caracteres en la URL que están reservados para expresiones regulares y deben escaparse.

¿Hay alguna función o método en la biblioteca de Boost para escapar de una cadena para este tipo de uso? Sé que hay tales métodos en la mayoría de las otras implementaciones de expresiones regulares, pero no veo uno en Boost.

Alternativamente, ¿hay una lista de todos los personajes que necesitarían ser escapados?

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

Irónicamente, podría usar una expresión regular para escapar de su URL para que pueda insertarse en una expresión regular.

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

(El boost::format_sed bandera boost::format_sed especifica usar el formato de cadena de reemplazo de sed. In sed, un escape & producirá lo que corresponda con la expresión completa)

O si no te sientes cómodo con el formato de cadena de reemplazo de sed, simplemente cambia la bandera para boost::format_perl , y puedes usar el $& familiar para referirte a lo que corresponda con la expresión completa.

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

Utilizando el código de Dav (+ una corrección de los comentarios), creé la función 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; } 

Para la versión ASCII, use std::string / boost::regex lugar de std::wstring / boost::wregex .

Lo mismo con 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; } 

En C ++ 11, puede utilizar literales de cadena sin formato para evitar el escape de la serie de expresiones regulares:

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

Consulte http://en.cppreference.com/w/cpp/language/string_literal , elemento (6).