正規表現の範囲パターンを使用して[01-12]
2 桁の mm を一致させようとしていますが、期待どおりに動作しません。
ベストアンサー1
正規表現における文字クラスの定義の仕組みを誤解しているようです。
、、、、、、、、、、、、または のいずれかの01
文字列を一致させるには、次のようなものを使用します。02
03
04
05
06
07
08
09
10
11
12
0[1-9]|1[0-2]
参考文献
- 正規表現.info/文字クラス
- 数値範囲(数値範囲として解釈される文字列の一致に関する多くの例があります)
説明
文字クラスは、それ自体では、一つ、そして正確に一つ文字を入力文字列から取り出します。[01-12]
実際には[012]
、入力の 1 文字を0
、、1
または の3 つの文字のいずれかと照合する文字クラスを定義します2
。
範囲-
定義は から までで1
、1
だけが含まれます1
。一方、 のようなものには、、、、、、、、[1-9]
が含まれます。1
2
3
4
5
6
7
8
9
初心者は、 のような定義をするという間違いをしがちです[this|that]
。これは「機能」しません。この文字定義は を定義します。[this|a]
つまり、入力の 1 文字をt
、h
、i
、s
、|
またはの 6 文字のいずれかに一致させますa
。おそらく(this|that)
これが意図されたとおりです。
参考文献
範囲の定義方法
between [24-48] hours
したがって、 のようなパターンは「機能しない」ことは明らかです。 この場合の文字クラスは と同等です[248]
。
つまり、文字クラスの定義では、パターン内の数値の範囲は定義されません。正規表現エンジンは、有限繰り返し構文 (例: 3 と 5 の間の一致)-
を除いて、パターン内の数値を実際には「理解」しません。a{3,5}
a
範囲定義では、代わりに文字の ASCII/Unicode エンコードを使用して範囲を定義します。文字は0
ASCII で 10 進数の 48;9
は 57 としてエンコードされます。したがって、文字定義[0-9]
には、エンコードで 10 進数の 48 から 57 までの値を持つすべての文字が含まれます。むしろ賢明なことに、設計上、これらは文字0
、、1
...、です9
。
参照
別の例: AからZ
もう一つの一般的な文字クラスの定義を見てみましょう[a-zA-Z]
ASCII の場合:
A
= 65、Z
= 90a
= 97、z
= 122
この意味は:
[a-zA-Z]
および[A-Za-z]
同等である- ほとんどのフレーバーでは、
[a-Z]
不正な文字範囲である可能性が高い- なぜなら、 (97)は(90)
a
よりも「大きい」からである。Z
- なぜなら、 (97)は(90)
[A-z]
有効ですが、次の 6 つの文字も含まれます。[
(91)、\
(92)、]
(93)、^
(94)、_
(95)、`
(96)