Javascriptdate正则expression式DD / MM / YYYY

我知道有很多正则expression式线程,我需要一个特定的模式,我不能在任何地方

此正则expression式以YYYY-MM-DD格式进行validation

/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/ 

我需要的模式是DD / MM / YYYY(第一天,因为它是西class牙语,只有“/”,“ – ”不应该被允许)

我search了几个正则expression式库,我认为这应该工作…但由于我不熟悉正则expression式我不确定它是否validation那样

 (0[1-9]|[12][0-9]|3[01])[ \.-](0[1-9]|1[012])[ \.-](19|20|)\d\d 

我也不知道要逃避斜线,我试图“看”string中的逻辑,但这就像试着“看”matrix码给我。 我把正则expression式string放在一个选项.js中

 [...] }, "date": { "regex": (0[1-9]|[12][0-9]|3[01])[ \.-](0[1-9]|1[012])[ \.-](19|20|)\d\d, "alertText": "Alert text AAAA-MM-DD" }, "other type..."[...] 

所以,如果正则expression式是好的,我将如何逃避它? 如果不是,那么正确的正则expression式是什么,我如何逃避它? :P

非常感谢

我用这个函数为dd / mm / yyyy格式:

 // (new Date()).fromString("3/9/2013") : 3 of september // (new Date()).fromString("3/9/2013", false) : 9 of march Date.prototype.fromString = function(str, ddmmyyyy) { var m = str.match(/(\d+)(-|\/)(\d+)(?:-|\/)(?:(\d+)\s+(\d+):(\d+)(?::(\d+))?(?:\.(\d+))?)?/); if(m[2] == "/"){ if(ddmmyyyy === false) return new Date(+m[4], +m[1] - 1, +m[3], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0); return new Date(+m[4], +m[3] - 1, +m[1], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0); } return new Date(+m[1], +m[3] - 1, +m[4], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0); } 

您可以采取validationYYYY / MM / DD的正则expression式,并将其反转以获得您需要的DD / MM / YYYY:

 /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/ 

顺便说一句 – 这个正则expression式validationDD / MM / YYYY或DD-MM-YYYY

PS这将允许date,如31/02/4899

正则expression式适合于匹配通用格式,但我认为您应该将parsing移到Date类中,例如:

 function parseDate(str) { var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/); return (m) ? new Date(m[3], m[2]-1, m[1]) : null; } 

现在你可以使用这个函数来检查有效的date; 然而,如果你需要实际validation没有滚动(例如“31/2/2010”不会自动滚动到“3/3/2010”),那么你有另一个问题。

[编辑]如果你还想validation没有滚动,那么你可以添加一个检查来比较原始string,以确保它是相同的date:

 function parseDate(str) { var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null , nonRolling = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/'))); return (nonRolling) ? d : null; } 

[编辑2]如果你想匹配零填充date(例如“08/08/2013”​​),那么你可以做这样的事情:

 function parseDate(str) { function pad(x){return (((''+x).length==2) ? '' : '0') + x; } var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null , matchesPadded = (d&&(str==[pad(d.getDate()),pad(d.getMonth()+1),d.getFullYear()].join('/'))) , matchesNonPadded = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/'))); return (matchesPadded || matchesNonPadded) ? d : null; } 

但是,填充date不一致的情况仍然会失败(例如“2013年8月8日”)。

从这里看看http://forums.asp.net/t/1410702.aspx/1

使用下面的正则expression式细节,这也将支持闰年。

 var reg = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g; 

如果你已经使用Javascript,你不能只使用Date.Parse()来validationdate,而不是使用regEx。

对于date的RegEx实际上是笨重的,很难得到正确的闰年和所有的权利。

尝试使用这个..

 [0-9]{2}[/][0-9]{2}[/][0-9]{4}$ 

这应该适用于这种模式DD/DD/DDDD其中D是任何数字(0-9)

花哨斜线只是使用\之前/它将被转义。 ( \/ => / )。

否则,你是正则expression式DD / MM / YYYY可能是下一个:

/^[0-9]{2}[\/]{1}[0-9]{2}[\/]{1}[0-9]{4}$/g

说明:

  • [0-9] :只是数字
  • {2}{4} :长度2或4.您也可以在{2,4}之间调整两个数字之间的长度(在这种情况下为2和4)
  • [\/] :字符/
  • g :Global – 或m :Multiline(可选,请参阅您的请求)
  • $ :锚到string结尾。 (可选,请参阅您的请求)
  • ^ :string的开始。 (可选,请参阅您的请求)

使用示例:

 var regex = /^[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}$/g; var dates = ["2009-10-09", "2009.10.09", "2009/10/09", "200910-09", "1990/10/09", "2016/0/09", "2017/10/09", "2016/09/09", "20/09/2016", "21/09/2016", "22/09/2016", "23/09/2016", "19/09/2016", "18/09/2016", "25/09/2016", "21/09/2018"]; //Iterate array dates.forEach( function(date){ console.log(date + " matches with regex?"); console.log(regex.test(date)); }); 
 ((?=\d{4})\d{4}|(?=[a-zA-Z]{3})[a-zA-Z]{3}|\d{2})((?=\/)\/|\-)((?=[0-9]{2})[0-9]{2}|(?=[0-9]{1,2})[0-9]{1,2}|[a-zA-Z]{3})((?=\/)\/|\-)((?=[0-9]{4})[0-9]{4}|(?=[0-9]{2})[0-9]{2}|[a-zA-Z]{3}) 

正则expression式编译它

 2012/22/Jan 2012/22/12 2012/22/12 2012/22/12 2012/22/12 2012/22/12 2012/22/12 2012-Dec-22 2012-12-22 23/12/2012 23/12/2012 Dec-22-2012 12-2-2012 23-12-2012 23-12-2012 

jquery.validationengine-en.js文件执行以下更改,并通过包含闰年更新dd / mm / yyyy内联validation:

 "date": { // Check if date is valid by leap year "func": function (field) { //var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/); var pattern = new RegExp(/^(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[\/\-\.](\d{4})$/); var match = pattern.exec(field.val()); if (match == null) return false; //var year = match[1]; //var month = match[2]*1; //var day = match[3]*1; var year = match[3]; var month = match[2]*1; var day = match[1]*1; var date = new Date(year, month - 1, day); // because months starts from 0. return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day); }, "alertText": "* Invalid date, must be in DD-MM-YYYY format" 

对于需要比1900年提前几年validation的人,下面应该这样做。 其实这与[@OammieR][1]给出的上述答案是一样的,但是包括1800 – 1899年在内。

 /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((18|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((18|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/ 

希望这可以帮助那些需要早于1900年validation的人,比如01/01/1855等。

感谢@OammieR最初的想法。

我build立这个定期检查月30/31,并让二月到29。

 new RegExp(/^((0[1-9]|[12][0-9]|3[01])(\/)(0[13578]|1[02]))|((0[1-9]|[12][0-9])(\/)(02))|((0[1-9]|[12][0-9]|3[0])(\/)(0[469]|11))(\/)\d{4}$/) 

我觉得,这个更简单,更灵活,更充分。

也许第一部分可以是合同,但我找不到合适的。