如何转义字符串以在Boost Regex中使用

时间:2009-08-10 03:25:50

标签: c++ regex boost escaping

我只是关注正则表达式,我正在使用Boost Regex库。

我需要使用包含特定URL的正则表达式,并且它会发生窒息,因为显然URL中有为正则表达式保留的字符,需要进行转义。

Boost库中是否有任何函数或方法来转义字符串以进行此类用法?我知道在大多数其他正则表达式实现中都有这样的方法,但我没有在Boost中看到它。

或者,是否有需要转义的所有字符的列表?

4 个答案:

答案 0 :(得分:38)

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

具有讽刺意味的是,您可以使用正则表达式来转义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中,转义&将输出与整个表达式匹配的任何内容。

或者,如果您对sed的替换字符串格式不满意,只需将标志更改为boost::format_perl,您就可以使用熟悉的$&来引用整个表达式匹配的任何内容。

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

答案 1 :(得分:13)

使用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

答案 2 :(得分:4)

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;
}

答案 3 :(得分:2)

在C ++ 11中,您可以使用原始字符串文字来避免转义正则表达式字符串:

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

http://en.cppreference.com/w/cpp/language/string_literal,第(6)项。