用于YYYY-MM-DD的JavaScript正则表达式,带有可选的月份和日期

用于YYYY-MM-DD的JavaScript正则表达式,带有可选的月份和日期,javascript,regex,date,Javascript,Regex,Date,我提出了以下PCRE正则表达式: [12]\d{3}(-)?(?(1)(0[1-9]|1[0-2]))(-)?(?(3)(0[1-9]|[12]\d|3[01])) 它与以下日期格式匹配: 2018-10-03 2011-03 2003年 如您所见,我使用条件语句来检测是否有破折号指示日期的下一部分。不幸的是,javascript不支持条件语句。如何将其转换为RegExp?我尝试过使用包含备选方案的非捕获组,但没有成功 编辑: 我不能使用任何JS函数,因为正则表达式将在模式HTML5输入属

我提出了以下PCRE正则表达式:

[12]\d{3}(-)?(?(1)(0[1-9]|1[0-2]))(-)?(?(3)(0[1-9]|[12]\d|3[01]))
它与以下日期格式匹配:

  • 2018-10-03
  • 2011-03
  • 2003年
如您所见,我使用条件语句来检测是否有破折号指示日期的下一部分。不幸的是,javascript不支持条件语句。如何将其转换为RegExp?我尝试过使用包含备选方案的非捕获组,但没有成功

编辑:


我不能使用任何JS函数,因为正则表达式将在
模式
HTML5输入属性中使用

这是我想制作的非正则版本

var日期=[“2018-10-03”、“2011-03”、“2003”、“12234”]
函数isDate(str){
var parts=str.split(“-”),
d=新日期(零件[0],零件长度>1?零件[1]-1:0,零件长度==3?零件[2]:1,12,0,0),
yearOk=parts[0]<3000&&d.getFullYear()==parts[0];//或任何测试
如果(零件长度==1)返回年份OK;
var monthOk=+parts[1]==d.getMonth()+1;
如果(零件长度==2)返回年份OK&&monthOk;
return yearOk&&monthOk&&+parts[2]==d.getDate();
}

dates.forEach(function(dStr){console.log(isDate(dStr))})
这是我想制作的非正则版本

var日期=[“2018-10-03”、“2011-03”、“2003”、“12234”]
函数isDate(str){
var parts=str.split(“-”),
d=新日期(零件[0],零件长度>1?零件[1]-1:0,零件长度==3?零件[2]:1,12,0,0),
yearOk=parts[0]<3000&&d.getFullYear()==parts[0];//或任何测试
如果(零件长度==1)返回年份OK;
var monthOk=+parts[1]==d.getMonth()+1;
如果(零件长度==2)返回年份OK&&monthOk;
return yearOk&&monthOk&&+parts[2]==d.getDate();
}

dates.forEach(function(dStr){console.log(isDate(dStr))}
您可以使用以下正则表达式:

[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?
基本上,它匹配一年,然后创建一个非捕获组,其中包含
日期
日期
部分在此组中为
可选
,而
整个组
的月份和日期也为
可选

这意味着它将仅匹配年、年和月,并将完整日期与年、月和日期匹配

编辑(添加锚定):


现在它与“2018 aaa”不匹配。

您可以使用此正则表达式:

[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?
基本上,它匹配一年,然后创建一个非捕获组,其中包含
日期
日期
部分在此组中为
可选
,而
整个组
的月份和日期也为
可选

这意味着它将仅匹配年、年和月,并将完整日期与年、月和日期匹配

编辑(添加锚定):


现在它将与“2018 aaa”不匹配。

用于
YYYY-MM-DD
模式的正则表达式,可选择月份和日期

var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;

带有可选月份和日期的
YYYY-MM-DD
模式的正则表达式

var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;

“它可以与非捕获组一起使用”“我尝试过使用包含备选方案的非捕获组,但我没有做到这一点。”我不能使用jquery或任何其他javascript函数,因为此正则表达式将在
模式
字段(HTML5)中使用。“它可以与非捕获组一起使用”“我尝试过使用包含备选方案的非捕获组,但没有成功。”我无法使用jquery或任何其他javascript函数,因为此正则表达式将用于
模式
字段(HTML5).regex.test(“2018 asd”)-->trueregex.test(“2018 asd”)-->trueregex.test(“2018 asd”)-->trueregex.test(“2018 asd”)-->trueregex第二个(编辑后)非常好用。谢谢。regex.test(“2018 asd”)-->True第二个(编辑后)非常好用。谢谢。