Javascript 如何允许正则表达式适用于mm/dd/yyyy和yyyy-mm-dd格式
我的mm/dd/yyyy正则表达式为:Javascript 如何允许正则表达式适用于mm/dd/yyyy和yyyy-mm-dd格式,javascript,regex,validation,date,Javascript,Regex,Validation,Date,我的mm/dd/yyyy正则表达式为: /^((0[1-9]|1[012])[\/](0[1-9]|[12][0-9]|3[01])[\/](19|20)[0-9]{2})*$/ 我想对mm/dd/yyyy和yyyy-mm-dd这两种格式都使用它 我也尝试了下面的一个,但不希望用户键入日期和月份的任何数字 /^((\d{4})-(\d{2})-(\d{2})|(\d{2})\/(\d{2})\/(\d{4}))$/ 我试着在下面让它工作,但不确定这里出了什么问题: /^((0[1-9]|1[
/^((0[1-9]|1[012])[\/](0[1-9]|[12][0-9]|3[01])[\/](19|20)[0-9]{2})*$/
我想对mm/dd/yyyy和yyyy-mm-dd这两种格式都使用它
我也尝试了下面的一个,但不希望用户键入日期和月份的任何数字
/^((\d{4})-(\d{2})-(\d{2})|(\d{2})\/(\d{2})\/(\d{4}))$/
我试着在下面让它工作,但不确定这里出了什么问题:
/^((0[1-9]|1[012])[\/](0[1-9]|[12][0-9]|3[01])[\/](19|20)[0-9]{2})|((19|20)[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])*$/
这就是您所需要的:
var regex = /^\d{2}\/\d{2}\/\d{4}|\d{4}-\d{2}-\d{2}$/;
regex.test("1990-03-25") // returns true
regex.test("01/10/2006") // returns true
下面给出了一个函数,该函数为您描述的格式生成解析器
dateParser('yyyy/mm/dd')('1990-03-25')
is{y:1990,m:3,d:25}
您还可以使用chain
函数chain([dateParser('mm/dd/yyyy')、dateParser('yyyy-mm-dd'))))('2014-04-04')
按顺序尝试格式
var patterns = {
yyyy: '\\d{4}',
yy: '\\d{2}',
mm: '0\\d|1[012]',
m: '0?\\d|1[012]',
dd: '[3][01]|[012]\\d',
d: '[3][01]|[012]?\\d',
HH: '[2][0-4]|[01][0-9]',
H: '[2][0-4]|[01]?[0-9]',
hh: '[1][0-2]|0\\d',
h: '[1][0-2]|0?\\d',
MM: '[0-5]\\d',
M: '[0-5]?\\d',
ss: '[0-5]\\d',
s: '[0-5]?\\d'
}
function dateParser(pattern) {
var groupToFieldNames = [null];
var regexPattern = pattern.replace(
/([A-Za-z]+)|[.?+*\[\]\(\)\{\}^$\|\\]/g,
function (m, field, punc) {
if (patterns.hasOwnProperty(field)) {
groupToFieldNames.push(field[0]);
return '(' + patterns[field] + ')';
} else if (punc) {
return '\\' + punc;
} else {
return m;
}
});
var regex = new RegExp('^' + regexPattern + '$');
return function (dateString) {
var match = dateString.match(regex);
if (match) {
var fields = {};
for (var i = 1, n = groupToFieldNames.length; i < n; ++i) {
fields[groupToFieldNames[i]] = parseInt(match[i], 10);
}
return fields;
}
};
}
function chain(parsers) {
var arr = parsers.slice(0);
return function (x) {
for (var i = 0, n = arr.length; i < n; ++i) {
var result = (0,arr[i])(x);
if (result) { return result; }
}
};
}
console.log(JSON.stringify(
dateParser('yyyy/mm/dd H:MM:ss')('2014/12/31 7:30:25')
));
console.log(JSON.stringify(
chain([dateParser('mm/dd/yyyy'), dateParser('yyyy-mm-dd')])
('2014-04-04')
));
var模式={
yyyy:'\\d{4}',
yy:'\\d{2}',,
mm:'0\\d | 1[012]',
m:'0?\\d | 1[012]',
dd:“[3][01]|[012]\\d”,
d:“[3][01]|[012]?\\d”,
HH:“[2][0-4]|[01][0-9]”,
H:“[2][0-4]|[01]?[0-9]”,
hh:“[1][0-2]| 0\\d”,
h:“[1][0-2]| 0?\\d”,
MM:“[0-5]\\d”,
M:“[0-5]?\\d”,
ss:“[0-5]\\d”,
s:“[0-5]?\\d”
}
函数日期分析器(模式){
var groupToFieldNames=[null];
var regexpatern=pattern.replace(
/([A-Za-z]+)\[.?+*\[\]\(\)\{\}^$\\\\\\]/g,
功能(m、字段、punc){
if(patterns.hasOwnProperty(字段)){
groupToFieldNames.push(字段[0]);
返回“(“+模式[字段]+”)”;
}否则如果(punc){
返回'\\'+punc;
}否则{
返回m;
}
});
var regex=new RegExp('^'+regexpatern+'$);
返回函数(日期字符串){
var match=dateString.match(regex);
如果(匹配){
变量字段={};
对于(变量i=1,n=groupToFieldNames.length;i
将日期传递到new date()
并查看发生了什么不是更容易吗?为什么不简单地将|放在它们之间?如果您能提供一个示例就好了。我试过了,但似乎不起作用!别忘了世界上其他地方也使用dd-mm-yyyy的逻辑顺序。他希望月和日也是有效的值。我建议通过正则表达式验证基本格式,然后将其传递到日期构造函数中,如注释中所述。你真的想要一个防止闰日的正则表达式吗?它很快就变丑了。