2011-11-08 13 views

答えて

4

r'[!-\.&]'r'[!-.]'を書くだけで複雑な形状である。

これは、すべてのCHが一致します33 = ord('!')46 = ord('.')ord、次のいずれかのつまりとaracters:

!"#$%&\'()*+,-. 

.前にエスケープバックスラッシュは文字クラスでは無視されます。文字クラス内のすべての文字に一致しても意味がありません(.)。アンパサンド&はすでに文字クラスに入っているので、それは余計です。

+1

つまり、 'r '[! - 。]''は同じです... –

+0

@FelixKling。答えにあなたのコメントをコピーしました。 – phihag

+1

@Eugene Yup。 'Character class'は'文字集合 'や'大括弧内のもの 'の正式な名前です。 – phihag

0

バックスラッシュはドットをエスケープするため、範囲は!から.になります。正規表現がマッチします:それは範囲に含まれている、そしてそれは文字クラス内なので、ドットをエスケープすることはどちらかの必要はありませんので、

!"#$%&'()*+,-. 

を最後&は必要ありません。

2

この正規表現の目的は、 "!"の間の任意の文字にマッチすることです。と "。" (スラッシュが "。"文字をエスケープしていることに注意してください)、これは! " # $ % & ' () * + , -です。 (http://www.tamasoft.co.jp/en/general-info/unicode.htmlのUnicodeテーブルから)。表現について

2つのコメントは:通常

  1. 、あなたは(\自体が、多分、除く)[]カッコ内の文字をエスケープする必要はありません。
  2. アンパサンド記号「&」は既に「!-.」で定義された範囲に含まれているため、冗長です。
+0

1)エスケープする必要がある他の文字があります。たとえば、 ' - [] ^'はどこに置かれているかによって決まります。2)文字クラスが '! - 。&'のみにマッチする可能性があります。つまり、 ' - 'は範囲を示すために使用するのではなく、ハイフンそのものを示すために使用されます。 – NullUserException

2

テストパターンがchr(46)を通じてchr(33)と一致しますが、パターンはすべてのシステムでそのように動作することを保証されていないことを示してもよいです。理由は次のとおりです。文字セットはシステムによって異なります。

Perlの正規表現のドキュメントは、特にから始めると等しい場合([a-e][A-E])、または数字([0-9])のアルファベットのいずれかで終わる範囲のみを使用する」をお勧めします理由です。他のものは安全ではありません」(Perl正規表現はPythonで使用される正規表現であるため、Perl正規表現は関係します)。

したがって、このパターンはEBCDICベースのプラットフォームで実行されると、異なる文字セットと一致します。 ASCIIベースのプラットフォームでパターンがchr(33)からchr(46)に一致すると言うだけです。

+0

あなたの警告はUTF-8/16に適用されますか? – eugene

+0

@Eugene:*任意の*マルチバイトエンコーディングでエンコードされたバイト列の*正規表現を使用することは非常に危険です。最初にUnicodeにデコードします。 –

関連する問題