Как выйти из строки для использования в Повышении Regex

Можно использовать HttpUtility.HtmlDecode

при использовании.NET 4.0 +, можно также использовать WebUtility.HtmlDecode , который не требует дополнительной ссылки на сборку, поскольку это доступно в System.Net пространство имен.

29
задан Gerald 10 August 2009 в 03:25
поделиться

3 ответа

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

По иронии судьбы, вы можете использовать регулярное выражение для экранирования вашего 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);
39
ответ дан 28 November 2019 в 01:22
поделиться

То же самое с 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;
}
4
ответ дан 28 November 2019 в 01:22
поделиться

Используя код из 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 .

14
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: