Можно использовать HttpUtility.HtmlDecode
при использовании.NET 4.0 +, можно также использовать WebUtility.HtmlDecode
, который не требует дополнительной ссылки на сборку, поскольку это доступно в System.Net
пространство имен.
. ^ $ | ( ) [ ] { } * + ? \
По иронии судьбы, вы можете использовать регулярное выражение для экранирования вашего 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 escape &
выведет все, что соответствует всему выражению)
Или, если вам не нравится формат строки замены sed, просто измените флаг на boost :: format_perl
, и вы можете использовать знакомый $ &
для ссылки на то, что соответствует всему выражению.
const std::string rep("\\\\$&");
std::string result = regex_replace(url_to_escape, esc, rep,
boost::match_default | boost::format_perl);
То же самое с 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;
}
Используя код из 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
.