我想要一个日期格式的正则表达式,例如: 2011年1月1日
我已写过^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4}
但未检查所有有效日期,如50-AAA-2011也将被视为有效。
我在javascript中使用Live Validation lib
我的代码
var sayDate = new LiveValidation('date');
sayDate.add( Validate.Format, { pattern: /^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4}/i });
请帮忙!
答案 0 :(得分:2)
怎么样:
^(0?[1-9]|[1-2][0-9]|3[0-1])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-[1-2][0-9]{3}$
这仍然允许31-feb-2011所以检查实际存在的日期你可能需要使用除了正则表达式之外的东西
答案 1 :(得分:1)
很明显,如果您只想验证Jan-Dec,则需要在RegEx中指定它。然后你必须验证日期药水是否正确。然后,该日期是否实际上对于给定的月份或年份有效,并且还有很多其他情况。我相信RegEx不是解决方案。您是否尝试使用Date.parse
之类的{{1}}?
答案 2 :(得分:1)
尝试使用正则表达式验证日期格式实际上比听起来要复杂得多。您可以非常轻松地进行基本验证,但总是需要做更多工作才能使其完美。
我建议改为使用日期选择器控件,它可以为您进行验证(并且还为您提供了一个很好的闪亮用户界面功能的奖励),或者其中一个现有的Javascript库可以处理日期你。
对于日期选择器控件,有任意数量的jQuery选项。对于日期处理库,我建议查找date.js。
希望有所帮助。
答案 3 :(得分:1)
您可以通过JavaScript regular expressions验证日期的语法。您可以使用Date对象检查语义,如下所示:
function ValidateCustomDate(d) {
var match = /^(\d{1,2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{4})$/.exec(d);
if (!match) {
// pattern matching failed hence the date is syntactically incorrect
return false;
}
var day = parseInt(match[1], 10); // radix (10) is required otherwise you will get unexpected results for 08 and 09
var month = {
Jan: 0,
Feb: 1,
Mar: 2,
Apr: 3,
May: 4,
Jun: 5,
Jul: 6,
Aug: 7,
Sep: 8,
Oct: 9,
Nov: 10,
Dec: 11
}[match[2]]; // there must be a shorter, simpler and cleaner way
var year = parseInt(match[3], 10);
var date = new Date(year, month, day);
// now, Date() will happily accept invalid values and convert them to valid ones
// 31-Apr-2011 becomes 1-May-2011 automatically
// therefore you should compare input day-month-year with generated day-month-year
return date.getDate() == day && date.getMonth() == month && date.getFullYear() == year;
}
console.log(ValidateCustomDate("1-Jan-2011")); // true
console.log(ValidateCustomDate("01-Jan-2011")); // true
console.log(ValidateCustomDate("29-Feb-2011")); // false
console.log(ValidateCustomDate("29-Feb-2012")); // true
console.log(ValidateCustomDate("31-Mar-2011")); // true
console.log(ValidateCustomDate("31-Apr-2011")); // false