2011-09-23 103 views
0

我希望有一个日期格式的正则表达式的特定日期,例如:年1月1 2011正则表达式格式

我已经写^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4},但不检查对于像50-AAA所有有效日期-2011也将被视为有效。

我使用Live Validation lib中的JavaScript

我的代码

var sayDate = new LiveValidation('date'); 
    sayDate.add(Validate.Format, { pattern: /^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4}/i }); 

请帮帮忙!

+2

验证该格式*看起来*右边是精细使用正则表达式,但使用正则表达式来验证日期实际上是一个有效的(什么用闰年,每月的天数不同等),正则表达式是错误的。 – Jamiec

+0

[正则表达式匹配有效日期]的可能重复(http://stackoverflow.com/questions/51224/regular-expression-to-match-valid-dates) – Jamiec

+0

你想要多久?你想赶上闰年?其他语言环境如何(“十月”与“Okt”等)? –

回答

1

试图验证日期格式使用正则表达式实际上比听起来复杂得多。你可以很容易地进行基本的验证,但总有那么一点点要做到完美。

我会建议改为使用日期选择器控件,它可以为你做验证(并且还给你一个不错的闪亮用户界面功能的奖励),或者其中一个现有的Javascript库可以处理日期为你。

对于日期选取器控件,有任意数量的jQuery选项。对于日期处理库,我建议查找date.js

希望有所帮助。

+0

'var d1 = Date.parse(dateCut); \t \t \t dateCut = d1。toString('dd-MMM-yyyy');'解决了我的问题。谢谢 – abi1964

1

很明显,如果您只希望Jan-Dec进行验证,您需要在RegEx中指定它。然后你必须验证日期药水是否正确。然后,该日期是否实际上对于给定的月份或年份有效,并且还有其他许多情况。我相信RegEx不是解决方案。您是否尝试过使用Date.parse之类的东西,如Datejs

+0

您可以给出任何片段或示例? – abi1964

+0

对不起Abhishek,我没有使用上述任何一种方法用JavaScript解析日期。但是,如果.NET和其他语言一样,我会使用'DateTime.Parse'解析日期服务器端。如果不是一个快速和肮脏的解决方案来检查几个基本日期解析规则,RegEx不是我会采用的推荐方法。 –

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 - 2月 - 2011所以检查的日期确实存在,你可能会需要使用其他的东西比一个正则表达式

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 
+0

感谢您的精彩剧本和解释。 – abi1964