Java正则表达式yyyymmdd验证

时间:2013-12-24 04:54:09

标签: java regex

请帮助我,为什么这个正则表达式在所有年份的20岁时都不起作用。但如果我单独将日期作为单独的Regex.thanks预先使用,那么它是有效的。

String regex = "^(0?[1-9]|[12][0-9]|3[01])?" ;  
checkRegex("02", regex);
checkRegex("22", regex);
checkRegex("20", regex);

String regex1 = "^(((19\\d\\d)|([2-9]\\d\\d\\d))\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?" ;    

checkRegex("19990802", regex1);
checkRegex("19990822", regex1);
checkRegex("19990820", regex1);

输出

02::::^(0?[1-9]|[12][0-9]|3[01])?::::true
22::::^(0?[1-9]|[12][0-9]|3[01])?::::true
20::::^(0?[1-9]|[12][0-9]|3[01])?::::true
19990802::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::true
19990822::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::true
19990820::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::false

2 个答案:

答案 0 :(得分:2)

您似乎期待一个10位数字,而不是8位数字。你的表达中间有一个额外的\\d\\d

^(((19\\d\\d)|([2-9]\\d\\d\\d))\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?
                               ^^^^^^
                                Here 

请注意,正则表达式会接受一些7位,8位和9位数字,原因有两个。

  1. 您已在月初和当天开始时0选择了?,而0位于每个?之后。
  2. 你通过最后的{{1}}让这一天成为可选日期。

答案 1 :(得分:1)

尝试:

String regex1 = [0-9]{4}[0-1][0-9][0-3][0-9]

我建议您使用:

string date= "19990820";
DateTime theTime= DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);