正規表現で日付文字列内の数値を検索できるようにしようとしています(例:1989年4月5日)。これは私が持っているものです:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
正規表現で日付文字列内の数値を検索できるようにしようとしています(例:1989年4月5日)。これは私が持っているものです:
\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z
角かっこは、数値範囲ではなく、文字範囲を作成します。
[A-Z]
A
からまでのすべてのASCII文字に一致しZ
ます。[1900-2012]
、、、、、との間のASCII文字の範囲、、、、およびに1
一致します。事実上、同じことを。として表すことができます。9
0
0
2
0
1
2
[0-29]
文字範囲式内では、文字の順序は重要ではありません。[0815]
と同じ[8510]
です。したがって[1900]
、と同じ[019]
です。
(19[0-9]{2}|200[0-9]|201[0-2])
正しい年の範囲に一致させたい。または、4桁だけを一致させたいが、範囲の検証を望まない場合は、次を使用できます。([0-9]{4})
月日も同じです。範囲検証を使用して実行することも、1桁または2桁を照合して実行することもできます。後者をお勧めします。
^([0-9]{1,2})/([0-9]{2})/([0-9]{4})$
結果を日付値に変換してみてください。それが失敗した場合、入力は無効でした。成功した場合は、結果の日付が必要な範囲内にあるかどうかを確認してください。正規表現は、日付の有効性チェックを提供するための間違ったツールです。
私はここで同様の質問に答えました:JavaScriptで「YYYYmmdd」形式の日付を解析する方法は?。抽出部分にいくつかの変更が必要です。
編集: あなたはこのようにその機能を変更することができます:
function parse(str) { // str format: 'dd/mm/yyyy'
var d = str.substr(0,2),
m = parseInt(str.substr(3,2)) - 1,
y = str.substr(6,4);
var D = new Date(y,m,d);
return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}
(?<!\d)((0?\d)|([12]\d)|(3[01]))/((0?\d)|(1[0-2]))/((19)|(20))\d\d
私が行ったテストで動作するようです。
(?<!\d)((((0?\d)|([12]\d)|(3[01]))/(((0?((1[02]?)|([3578]))))|(1[0-2])))|(((0?\d)|([12]\d))/(0?2))|(((0?\d)|([12]\d)|(30))/((0?[2469])|(11))))/((19)|(20))\d\d
以前の正規表現はのような無効な日付と一致します31/02/2012
が、これはもう少し規範的なようです。
私見これは有効とは一致しません10/10/1989
が、無効と一致します099/0991989
。まず、との間に2桁の数字を加えたものに0[1-9]{2}
一致します。また、あなたが望むものではありません。0
1
9
[1900-2012]
これを試して
\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z
dd / mm / yyyy(1900〜2012)の形式の日付と一致する必要があります