1. ホーム
  2. regex

[解決済み] 01-12]レンジが期待通りに動作しないのはなぜですか?

2022-03-05 01:36:50

質問

範囲指定パターンを使用しようとしている [01-12] の正規表現で2桁のmmにマッチさせることができますが、これは期待通りには動作しません。

解決方法は?

正規表現における文字クラスの定義がどのように機能するかを誤解しているようです。

いずれかの文字列にマッチするには 01 , 02 , 03 , 04 , 05 , 06 , 07 , 08 , 09 , 10 , 11 または 12 というようなことができます。

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

参考文献


説明

文字クラスは、それ自体で、次のようなマッチングを試みます。 1つだけ の文字が入力されます。 [01-12] 実際に定義されているのは [012] 入力の1文字を3文字のいずれかにマッチさせる文字クラスです。 0 , 1 または 2 .

- 範囲定義は 1 から 1 だけが含まれます。 1 . 一方、次のようなものは [1-9] には 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 .

初心者がよく間違えるのは、以下のような定義です。 [this|that] . これはうまくいきません。この文字定義では [this|a] の6文字のいずれかとマッチします。 t , h , i , s , | または a . より可能性が高いのは (this|that) が意図するところです。

参考文献


レンジの定義方法

というパターンがあることは、もう明らかですね。 between [24-48] hours はうまくいきません。この場合の文字クラスは、次のものと同等です。 [248] .

ということです。 - の文字クラス定義では、パターン内の数値範囲は定義されません。Regex エンジンは、パターンの中の数字をあまり理解しませんが、有限反復構文(例えば a{3,5} は3から5の間にマッチします。 a ).

範囲定義の代わりに、文字のASCII/Unicodeエンコーディングを使用して範囲を定義します。文字 0 は、ASCIIでは10進数48でエンコードされています。 9 は57である。したがって、文字定義 [0-9] は、10進数48から57の間の値を持つすべての文字をエンコーディングに含めます。むしろ感覚的に、デザイン上、これらの文字は 0 , 1 , ..., 9 .

こちらもご覧ください


もうひとつの例 AからZまで

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

ASCIIの場合。

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

ということになります。

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

関連する質問