2009-08-19 11 views
1

値は何でもあり、一致はnullです。これのポイントは、 "1991-12-01"のような文字列を分割し、文字列のすべての部分が有効な日付であることを確認することです。このjQuery検証コードで何が問題になりますか? regexp.exec(値)

dateISO: function(value, element) { 
    if (this.optional(element)) return true; 
    var regexp = new RegExp('^\d{4}[\/-](\d{1,2})[\/-](\d{1,2})$'); 
    var matches = regexp.exec(value); 
    alert(matches); 

答えて

7

あなたが与えている表現は、このように、エスケープ必要があり、文字列である:

var regexp = new RegExp('^\\d{4}[\\/-](\\d{1,2})[\\/-](\\d{1,2})$'); 

また、あなたはperlのスタイルの表現を行うことができますが、スラッシュはエスケープする必要があります。

var regexp = /^\d{4}[\\/-](\d{1,2})[\\/-](\d{1,2})$/; 

(perlスタイルの正規表現はRegExpオブジェクトを返します)

+1

100 ADの前に日付を検証する必要がないよう、私はこの1つは右であるので、答えを追加する必要はありませんが、私は指摘します動作しますイアンのために、今のようにパターンはかなりリベラルです。たとえば、現在のパターンでは、 "1991-50-42"が有効な日付として渡されます。 – EBGreen

+0

はい、マッチの各要素をチェックする審美的な理由から、他のコードが表示されませんでした。 –

+0

ちょうど正規表現のパターンが少なくとも文字列*が日付である可能性があることを確認していないのはなぜですか? – EBGreen

4

ここでは正規表現を一切スキップしないのはなぜですか?私はこれが方法より多くのコードであることを知っていますが、11月31日を指定する日付のように、正規表現ではできない日付のエラーを返します。

var datesToTest = [ 
    "1991-12-01" // valid 
    , "1991-11-31" // invalid, Nov has 30 days 
    , "1991-13-01" // invalid, no 13th month 
]; 

// Note: console.log() requires Firebug - switch to alert() if you wish 
for (var i = 0; i < datesToTest.length; i++) 
{ 
    if (!isValidDate(datesToTest[i], '-')) 
    { 
    console.log(datesToTest[i] + ' is not a valid date!'); 
    } else { 
    console.log(datesToTest[i] + ' is valid date!'); 
    } 
} 

function isValidDate(dateAsString, delimiter) 
{ 
    var dateObject = new Date(dateAsString.replace(new RegExp(delimiter, 'g'), '/')); 
    var checkDate = [ 
     dateObject.getFullYear() 
    , zeroFill(dateObject.getMonth() + 1, 2) 
    , zeroFill(dateObject.getDate(), 2) 
    ].join(delimiter); 
    return (dateAsString == checkDate); 
} 

function zeroFill(number, width) 
{ 
    width -= number.toString().length; 
    if (width > 0) 
    { 
    return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number; 
    } 
    return number; 
} 

これは、限り、あなたは= P

関連する問題