2011-09-18 21 views
0

文字をフィルタリングするコードを持つと/ ".:=どうすれば-を許可するのですか?RegExp文字列フィルタリング - ` - '記号を許可する方法?

#include <boost/regex.hpp> 
#include <boost/algorithm/string/regex.hpp> 

std::string filter_args(std::string args) 
{ 
    std::cout << boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: ]+")); 
    return boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: ]+")); 
} 

答えて

1

Boost's default Regex behaviour is Perl-compatible 、およびman perlreは言う:

あなたはリストから任意の文字に一致します文字[]で 、リストを囲むことで、文字クラスを指定することができます。 "["が "^"の後の最初の 文字の場合、クラスは にない文字と一致します。 リスト内の " - "文字は範囲を指定するため、 a-zは "a"と "z"の間のすべての文字を表します。 " - "または "]"自体をクラスのメンバーにしたい場合は のリスト(おそらく "^"の後)に置くか、 バックスラッシュでエスケープします。 " - "は、それが リストの最後、終了 "]"の直前にあるときに文字通り取られます。(すべては3つの文字の同じ クラス次のように指定します。[-az][az-]、および[a\-z]をすべてでもEBCDICベースの文字セットに二十から六 文字を含むクラスを指定[a-z]、異なる です。)また、あなたが範囲の をエンドポイントとして、文字クラス\wを使用\W\s\S\d、または\D しようとすると、「 - 」は文字通り理解されています。


だから:

boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\"/.: -]+")) 

又は

boost::erase_all_regex_copy(args, boost::regex("[^a-zA-Z0-9=\\-\"/.: ]+")) 

(ダブルバックスラッシュに気づく;一方はリテラル文字列、および正規表現のエスケープするための第2のエスケープします) 。

前者をお勧めします。


常に最初のコール先としてドキュメントをチェックしてください。

1

\でエスケープします。それはうまくいくはずです。 \-

実際には2回行う必要があります。 \\-\をエスケープするには1回、-をエスケープするには2番目の時間。

+0

は、メモリ位置0x003ef0a4..12のboost :: exception_detail :: clone_impl で失敗します。 – Rella

+0

@ Kambumbus - もう一度やり直してください。 –

+0

正しい場所に置いた場合、エスケープする必要はありません。 –

1

[^a-zA-Z0-9=\"/.: -]のように、最後に角かっこを入れます。

+0

ガレート!)しかし、なぜこれがこのように行われるのですか? – Rella

+0

@カブンバス:そのキャラクターが含まれるように頼んだので。なぜそれはこのようにしてはならないと思いますか? –

+1

通常、a-zのような範囲を意味するため、そこに使用しています。 – jpa

関連する問題