2016-10-22 25 views
4

ユーザが提供する文字列があるとします。あらゆる種類の文字を含めることができます。例としては、C++ 11/regex - 正確な文字列を検索する、エスケープ

std::string s1{"hello world"); 
std::string s1{".*"); 
std::string s1{"*{}97(}{.}}\\testing___just a --%#$%# literal%$#%^"}; 
... 

今、私は<<続く入力文字列s1続い>>の出現のためにいくつかのテキストで検索したいです。 s1に特殊文字が含まれていなかった場合、これは正常に動作します

std::string input; // the input text 
std::regex regex{">> " + s1 + " <<"}; 

if (std::regex_match(input, regex)) { 
    // add logic here 
} 

:このために、私は次のコードを持っています。しかし、s1に正規表現エンジンで認識されるいくつかの特殊文字が含まれていても動作しません。

s1にはどのようにしてstd::regexがリテラルと見なされるので、s1と解釈されませんか?言い換えれば、正規表現は次のようになります。

std::regex regex{">> " + ESCAPE(s1) + " <<"}; 

stdESCAPE()のような機能はありますか?

重要私は私の質問を単純化しました。私の実際のケースでは、正規表現ははるかに複雑です。 s1が解釈されているという事実だけに悩まされているので、私はこれらの詳細を残しました。

+2

正規表現を使用する特定の理由はありますか?これは 'string.find'で行うことができます –

+0

なぜ入力文字列(' s1')を正規表現として使用していますか?おそらく 'std :: regex Regex {" >> * << "}};のようなものが良いでしょうか? – ForceBru

+0

@Austin Brunkhorstはい、私の場合は正規表現が必要です。私は文字列がエンジンによって解釈されているという事実だけに苦しんでいるので、質問を簡略化しました。私の実際のケースでは、正規表現はより複雑です。 –

答えて

1

文字列内のすべての特殊文字を\でエスケープする必要があります。最も簡単な方法は、式regexを作成する前に、別の式を使用して入力文字列をサニタイズすることです。

// matches any characters that need to be escaped in RegEx 
std::regex specialChars { R"([-[\]{}()*+?.,\^$|#\s])" }; 

std::string input = ">> "+ s1 +" <<"; 
std::string sanitized = std::regex_replace(input, specialChars, R"(\$&)"); 

// "sanitized" can now safely be used in another expression 
+0

本当に '^'をここからエスケープする必要がありますか?そして、あなたは改行や何かを扱うためにすべての空白を含んでいますか?少しの説明が役に立つでしょう。また、 '\'もエスケープする必要はありませんか? – Cornstalks

+0

'^'は完全性のためにマッチしています - 明らかに、前の '' 'と行の先頭が一致することはありませんが、OPは単純化されています。空白と改行について何を意味するのか詳しく説明できますか? –

+1

'^'を含めて意味がありますが、バックスラッシュでエスケープしました。私はこの状況でバックスラッシュであなたがなぜそれをエスケープしたのか不思議です。また、空白にマッチする '\ s'をインクルードしていますが、なぜそれが必要なのか分かりません(改行処理なのでしょうか?私は気にせず、std :: regexが改行をどのように扱い、それらが違いを生むかどうか)。そして私の前のコメントでは、 '' \ 'は' specialChars 'にも含めるべきだと言ってみましたが、Markdownはそれを食べました。 – Cornstalks

関連する問題