2009-08-10 28 views
23

私は正規表現の周りに頭を抱えています。私はBoost Regexライブラリを使用しています。Boost Regexで使用する文字列をエスケープする方法

特定のURLを含む正規表現を使用する必要があります。正規表現用に予約されているため、エスケープする必要があることは明らかです。

Boostライブラリには、このような使用のために文字列をエスケープする関数やメソッドはありますか?私は、他のほとんどの正規表現の実装ではこのようなメソッドがあることを知っていますが、私はBoostでそれを見ません。

また、エスケープする必要があるすべての文字のリストがありますか?

答えて

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

皮肉なことに、あなたはそれが正規表現に挿入できるように、あなたのURLをエスケープするために正規表現を使用することができます。 (全体の表現にマッチするものは何でもSED、エスケープ&意志出力でフラグboost::format_sedは、sedのの置換文字列の書式を使用することを指定します。)

const boost::regex esc("[.^$|()\\[\\]{}*+?\\\\]"); 
const std::string rep("\\\\&"); 
std::string result = regex_replace(url_to_escape, esc, rep, 
            boost::match_default | boost::format_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); 
+0

正規表現を使って試してみましたが、私はまだかなり無能で、奇妙なことが起こっていました:p私は正規表現についていくつかの本を注文しましたので、私の無知は短命です!その間に、これらの文字をエスケープするために通常の文字列置換を使用することは、私の即時のニーズのために働いた、ありがとう。 – Gerald

+0

エスケープする必要のあるキャラクタの前にバックスラッシュを追加すると思っています。私はしばらくの間ブーストを使用していませんが、保証はありません。 – Amber

+7

それは近くにあった、ちょうどrepの終わりに "&"を加えなければならなかった、そしてそれは働いた。ありがとう。 – Gerald

4
boost::xpressiveと同じ

:ASCIIバージョン、使用のために

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

:ダヴからのコードを使用して

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

(+コメントからの修正が)、私はASCII/Unicode関数regex_escape()を作成しました/boost::wregexの代わりにstd::string/boost::regexとなります。 C++ 11では

1

、あなたは正規表現の文字列をエスケープ避けるために生の文字列リテラルを使用することができます。

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

http://en.cppreference.com/w/cpp/language/string_literalを参照してください、アイテム(6)。

関連する問題