2017-11-10 4 views
2

「dd/mm/yyyy」という形式の2つの日付フィールドを検証したかったのです。しかし、2番目の日付の検証は常にfalseを与えます。複数の日付を同じパターンで正規表現で検証する

var pattern = /\d{2}\/\d{2}\/\d{4}/gi; 

if (pattern.test(date1) && pattern.test(date2)) { 
     //Do something 
    } 

Chromeのコンソールで試したところ、 これが結果です。なぜそれは正しく検証されないのですか?

var pattern= /\d{2}\/\d{2}\/\d{4}/gi 
pattern.test("21/12/2008"); 
true 
pattern.test("21/12/2009"); 
false 
pattern.test("21/12/2008"); 
true 
pattern.test("21/12/2009"); 
false 

答えて

3

あなたの文字列がのみ日付になりたい場合は、次の

var pattern = /^\d{2}\/\d{2}\/\d{4}$/;

あなたがにあなたの文字列をしたい場合は日付が含まれています。

var pattern = /\d{2}\/\d{2}\/\d{4}/;


働いていなかった何

:数字と/

g、当社の正規表現に興味深い意味を持っている、グローバルな意味を持つの日付を検索する際

iは大文字小文字を区別しない、意味がない...

は、コンソールでこの例を実行してみてください:

var pattern = /\d{2}\/\d{2}\/\d{4}/gi; 
pattern.test("21/12/2009"); 
true 
pattern.test("21/12/2008"); 
false 
pattern.test("21/12/2008"); 
true 
pattern.test("21/12/2009"); 
false 
pattern.test("21/12/2009"); 
true 
pattern.test("21/12/2009"); 
false 

注トンということ私たちがテストに送るものには何の支障もありません。

これは、gフラグを使用するとJavaScriptの正規表現エンジンが不潔であるためです。テストからテストまでの状態を保持します。この質問から:

あなたが最初に一致した時点でJS正規表現のグローバルフラグ「テスト」と「実行」メソッド各停止を使用しますが、それらは、文字列で検索を停止した場所へのポインタを保持Interesting test of Javascript RegExp。そのポインタは、lastIndexプロパティで検査できます。 「test」または「exec」をもう一度呼び出すと、lastIndexから始まる一致を検索し始めます。

したがって、文字列全体に一致する文字列に対してRegExpをテストすると、lastIndexは文字列の最後に設定されます。次回のテストでは、文字列の最後から開始し、falseを返し、lastIndexを0に戻します。

我々は、この動作は上記の当社のコード例から続けて見ることができます:

pattern.test("21/12/2009"); 
true 
pattern.lastIndex 
10 
pattern.test("21/12/2009"); 
false 
pattern.lastIndex 
0 
pattern.test("21/12/2009"); 
true 
関連する問題