[01-12]
正規表現で範囲パターンを使用して2桁のmmに一致させようとしていますが、これは期待どおりに機能しません。
\d+
パターンを使用するだけです。2。)一致した文字列をコード内の数値に変換します。3.)のように番号範囲を確認しますif(num >= 0 && num <= 12){ /*do something*/ }
。非常に高速で柔軟性があります。
[01-12]
正規表現で範囲パターンを使用して2桁のmmに一致させようとしていますが、これは期待どおりに機能しません。
\d+
パターンを使用するだけです。2。)一致した文字列をコード内の数値に変換します。3.)のように番号範囲を確認しますif(num >= 0 && num <= 12){ /*do something*/ }
。非常に高速で柔軟性があります。
回答:
正規表現で文字クラス定義がどのように機能するかを誤解しているようです。
文字列のいずれかに一致するには01
、02
、03
、04
、05
、06
、07
、08
、09
、10
、11
、または12
、この作品のようなもの:
0[1-9]|1[0-2]
文字クラスは、それ自体で、入力文字列の1つの文字と正確に1つの文字を照合しようとします。[01-12]
実際に定義し[012]
、3つの文字のいずれかに対する入力から1つの文字に一致する文字クラスを0
、1
または2
。
-
範囲の定義から行く1
に1
だけ含まれています、1
。一方、のようなものが[1-9]
含まれ1
、2
、3
、4
、5
、6
、7
、8
、9
。
初心者はしばしばのようなものを定義することの間違いを犯し[this|that]
ます。これは「機能しません」。この文字の定義定義を[this|a]
、すなわち、それは、6つの文字のいずれかに対する入力から1つの文字にマッチしt
、h
、i
、s
、|
またはa
。おそらく(this|that)
意図されたものです。
したがって、のようなパターンbetween [24-48] hours
が「機能しない」ことは明らかです。この場合の文字クラスはと同等[248]
です。
つまり-
、文字クラスの定義では、パターンの数値範囲を定義していません。正規表現エンジンは、パターン内の数値を実際に「理解」しませんが、有限反復構文(例:a{3,5}
3と5の間の一致a
)を除きます。
範囲の定義では、代わりに文字のASCII / Unicodeエンコーディングを使用して範囲を定義します。文字0
はASCIIで10進数48としてエンコードされます。9
したがって、文字定義に[0-9]
は、エンコードで10進数の48と57の間の値を持つすべての文字が含まれます。むしろ賢明に、設計することで、これらは文字です0
、1
、...、 9
。
別の一般的な文字クラス定義を見てみましょう [a-zA-Z]
ASCIIの場合:
A
= 65、Z
= 90a
= 97、z
= 122この意味は:
[a-zA-Z]
そして[A-Za-z]
同等です[a-Z]
は、不正な文字範囲である可能性があります
a
(97)より、 "より大きい"であるZ
(90)[A-z]
は合法ですが、次の6つの文字も含まれます。
[
(91)、\
(92)、]
(93)、^
(94)、_
(95)、`
(96)0[1-9]|1[0-2]
ません。論理的な次のステップにそれを変更することは[1-9]|1[0-2]
理解できる理由から(それが一致するためのいずれかに動作しない1
だけで10
、11
、および12
)。\b(?:[0-9]|1[0-1])\b
それを防ぐために使用する必要がありました。\b
さんは(境界必ず正規表現は、単語と一致する(または、このケース番号で)作る^
&$
なかったです)。括弧は、または(|
)を反対側と見なします。そして最後?:
に、ブラケットを使用してサブマッチを作成しないことです。
"1,2,3,4,5,6,7,8,9,10,17,18".match(/^(([1-9]|1[0-7])\,?)+$/g )
このJS正規表現が17を超える理由は何ですか?
[...]
構文で示される正規表現の文字クラスは、入力内の単一の文字に一致するルールを指定します。そのため、括弧内に記述するすべてのものは、単一の文字を照合する方法を指定します。
[01-12]
したがって、パターンは次のように分類されます。
つまり、基本的に一致するのは0、1、または2だけです。
必要な照合を行うには、01〜12の範囲の2桁を数字として照合するために、それらがテキストとしてどのように見えるかを考える必要があります。
あなたが持っている:
次に、そのための正規表現を記述する必要があります。これは次のようになります。
+-- a 0 followed by 1-9
|
| +-- a 1 followed by 0-2
| |
<-+--> <-+-->
0[1-9]|1[0-2]
^
|
+-- vertical bar, this roughly means "OR" in this context
それらを組み合わせて短い式を取得しようとすると、無効な入力に対して誤検出の一致が発生して失敗することに注意してください。
たとえば、パターン[0-1][0-9]
は基本的に00-19の数字に一致しますが、これはあなたが望むものより少し多いです。
文字クラスの詳細については、明確なソースを探してみましたが、今のところ、この正規表現文字クラス用のGoogleクエリだけをお伝えできます。うまくいけば、そこにあなたを助けるためにいくつかのより多くの情報を見つけることができるでしょう。
[0-1][0-2]
も一致し00
ます。とは言っても、リンクの+1(これは私の回答で使用しました)。
[0-1][0-2]
それは文字列が好きなことができるように慎重に解釈しなければならない00
、01
と02
、それは認めていない03
まで09
、最終的に認め10
、11
そして12
。そのための正しい正規表現は[1-9]|1[0-2]
、または0*([1-9]|1[0-2])
(これは最後に任意の数の先行ゼロを許可する)です。
[]
正規表現のsは文字クラスを示します。範囲が指定されていない場合は、暗黙的に、または範囲内のすべての文字がまとめられます。したがって、何もキャプチャしないことを除いて[abcde]
、と同じ(a|b|c|d|e)
です。それは、のいずれかと一致しますa
、b
、c
、d
、またはe
。範囲が示すのはすべて文字のセットです。[ac-eg]
「のいずれかに一致します:a
; c
との間の任意の文字e
;またはg
」。したがって、あなたの一致は、「次のいずれかに一致します:0
; 1
との間の任意の文字1
(つまり、ちょうど1
);または2
。
あなたの目標は、番号の範囲を指定することが明らかである:任意の数の間01
と12
2桁の数字で書かれました。この特定のケースでは、あなたがそれを一致させることができます0[1-9]|1[0-2]
:いずれかの0
間のいずれかの数字が続く1
と9
、あるいは1
間のいずれかの数字が続く0
と2
。一般に、任意の数値範囲を同様の方法で有効な正規表現に変換できます。ただし、正規表現よりも優れたオプションや、正規表現を作成できる既存の関数またはモジュールがある場合があります。それはあなたの言語に依存します。
polygenelubricantsが言うように、文字クラス([]内のもの)は文字列ではなく文字と一致するため、希望するものではなく0 | 1-1 | 2を探します。
0|1-1|2
-この表記は非常に誤解を招くものです。のようなもの0|1|2
がより正確になります。
[a-z0-9]
、すべての小文字とすべての数字に一致しますが、1文字としてのみ一致します。