在yyyyMMdd中对1900-9999的java正则表达式验证

时间:2013-12-12 12:20:22

标签: java regex

如何从

转换正则表达式
^((19|20)\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])? for 1900-2099

上面的一个工作完美,只想更改日期格式1900-9999。所以去下面一个。

我试过这样做不起作用

^(([19-99])\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])? for 1900-9999

有什么问题请指导我解决这个问题。

3 个答案:

答案 0 :(得分:4)

甚至不使用正则表达式来验证整数范围(这是维护地狱之后,就像你现在一样)。而是将您的字符串解析为更准确的日期或整数,并使用< <= > >=运算符。

int year = Integer.parseInt(yourYear)
if (year >= 1900 && year <= 9999){
    //do your job here
}

但是如果你没有选择而你必须使用正则表达式,你可以尝试使用
19\\d\\d|[2-9]\\d\\d\\d您可以将其视为

19xx  <->    1    9 \\d \\d
2xxx  <-> [2-9] \\d \\d \\d
3xxx  <-> [2-9] \\d \\d \\d
4xxx  <-> [2-9] \\d \\d \\d
5xxx  <-> [2-9] \\d \\d \\d
6xxx  <-> [2-9] \\d \\d \\d
7xxx  <-> [2-9] \\d \\d \\d
8xxx  <-> [2-9] \\d \\d \\d
9xxx  <-> [2-9] \\d \\d \\d

较短的正则表达式可能是19\\d{2}|[2-9]\\d{3}

答案 1 :(得分:0)

[19-99]character class运算符[..]的错误用法。此部分会将一个字符与1999中的一个字符匹配(即仅1 }或9)。

我不知道为什么top(“working”)表达式如此复杂。你可以使用

\b(19|20)\d\d\b

为1900-2099,

\b19\d\d\b

1900-1999。双重转义mybackslashes以用于Java字符串。

(......在另一个问题发生变化后)

并且对于1900-9999,只需使用

\b(19|[2-9]9)\d{2}\b

答案 2 :(得分:0)

表达式可能如下所示:

^(19|[2-9]\\d)\\d{2}$

解释:

^:字符串的开头
(19|[2-9]\\d):值19或值2099
\\d{2}:值0099
$:字符串结尾