[01-12] の範囲が期待どおりに動作しないのはなぜですか? 質問する

[01-12] の範囲が期待どおりに動作しないのはなぜですか? 質問する

正規表現の範囲パターンを使用して[01-12]2 桁の mm を一致させようとしていますが、期待どおりに動作しません。

ベストアンサー1

正規表現における文字クラスの定義の仕組みを誤解しているようです。

、、、、、、、、、、、、または のいずれかの01文字列を一致させるには、次のようなものを使用します。0203040506070809101112

0[1-9]|1[0-2]

参考文献


説明

文字クラスは、それ自体では、一つ、そして正確に一つ文字を入力文字列から取り出します。[01-12]実際には[012]、入力の 1 文字を0、、1または の3 つの文字のいずれかと照合する文字クラスを定義します2

範囲-定義は から までで11だけが含まれます1。一方、 のようなものには、、、、、、、、[1-9]が含まれます。123456789

初心者は、 のような定義をするという間違いをしがちです[this|that]。これは「機能」しません。この文字定義は を定義します。[this|a]つまり、入力の 1 文字をthis|またはの 6 文字のいずれかに一致させますa。おそらく(this|that)これが意図されたとおりです。

参考文献


範囲の定義方法

between [24-48] hoursしたがって、 のようなパターンは「機能しない」ことは明らかです。 この場合の文字クラスは と同等です[248]

つまり、文字クラスの定義では、パターン内の数値の範囲は定義されません。正規表現エンジンは、有限繰り返し構文 (例: 3 と 5 の間の一致)-を除いて、パターン内の数値を実際には「理解」しません。a{3,5}a

範囲定義では、代わりに文字の ASCII/Unicode エンコードを使用して範囲を定義します。文字は0ASCII で 10 進数の 48;9は 57 としてエンコードされます。したがって、文字定義[0-9]には、エンコードで 10 進数の 48 から 57 までの値を持つすべての文字が含まれます。むしろ賢明なことに、設計上、これらは文字0、、1...、です9

参照


別の例: AからZ

もう一つの一般的な文字クラスの定義を見てみましょう[a-zA-Z]

ASCII の場合:

  • A= 65、Z= 90
  • a= 97、z= 122

この意味は:

  • [a-zA-Z]および[A-Za-z]同等である
  • ほとんどのフレーバーでは、[a-Z]不正な文字範囲である可能性が高い
    • なぜなら、 (97)は(90)aよりも「大きい」からである。Z
  • [A-z]有効ですが、次の 6 つの文字も含まれます。
    • [(91)、\(92)、](93)、^(94)、_(95)、`(96)

関連する質問

おすすめ記事