0

日付の検証を行うJavaScript関数があります。

var regex = new RegExp(my regex expression is here);

var result = regex.test(valueToTest);

ただし、テストが常に false を返すため、ここ数時間は尻尾を追いかけていました。

This does not work
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$

This does not work
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d{2}$

This works
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$

3 つのパターンの唯一の違いは、最後の 2 桁です。すべてが完全に有効に見えますが、3 番目のものだけが true を返します。

私が間違ったことをしたかどうか、またはブラウザー (Firefox) に問題があるかどうかを理解しようとしています。

何か案は?

4

5 に答える 5

3

正規表現なしの検証はどうですか?

function validateDate(string) {
    var parts = string.split("/");
    var year = parseInt(parts[2]);
    var month = parseInt(parts[1]) - 1;
    var day = parseInt(parts[0]);
    var date = new Date(year, month, day);
    return date.getFullYear() === year && date.getMonth() === month && date.getDate() === day;
}

デモ

于 2013-02-07T16:36:26.960 に答える
1

おそらく、これらの正規表現を文字列に入れています。その場合、"\d"は に変換されてい"d"ます。

二重スラッシュを使用してみてください:"\\d"

ただし、他のいくつかの提案には同意する必要があります。日付の解析に正規表現を使用しないでください。彼らはその仕事にあまり適していません。

たとえば'31/02/1985'、日付ではない式を使用できます。特に、うるう年(400 年の期間内の 3 年を除いて 4 年ごとに発生する) で問題が発生します。それを正規表現と一致させてみてください!

于 2013-02-07T16:31:24.260 に答える
1

"\\d"の代わりに使用する必要があります"\d"

これは、テストデータを使用して問題を再現します。

var regex1 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$");
var regex2 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d{2}$");
var regex3 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$");

document.write("<div>1: "+regex1.test("22/11/1982")+"</div>");
document.write("<div>2: "+regex2.test("22/11/1982")+"</div>");
document.write("<div>3: "+regex3.test("22/11/1982")+"</div>");

出力:

1: false
2: false
3: true

これは修正を再現します:

var regex1 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\\d\\d$");
var regex2 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\\d{2}$");
var regex3 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$");

document.write("<div>1: "+regex1.test("22/11/1982")+"</div>");
document.write("<div>2: "+regex2.test("22/11/1982")+"</div>");
document.write("<div>3: "+regex3.test("22/11/1982")+"</div>");

出力:

1: true
2: true
3: true
于 2013-02-07T16:32:13.170 に答える
1

コンストラクターを使用する場合new RegExp()は、文字列形式を使用する必要があります。

例 :

var regex = new RegExp(my regex expression is here);
var result = regex.test("(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}" ,"ig");

ただし、コンストラクターを使用することはお勧めしません。これを使用してみてください。

result.match(/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)[0-9]{2}$/ig);

そうでない場合、 RegExp で何をしたいですか?

于 2013-02-07T16:22:07.690 に答える
0

スラッシュをエスケープしてみてください

例:^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d{2}$

于 2013-02-07T16:15:07.127 に答える