正则expression式匹配来testing一个有效的年份

给定一个值,我想validation它是否是有效的一年。 我的标准很简单,值应该是一个4字符的整数。 我知道这不是最好的解决scheme,因为它不会允许年前1000 ,并将允许如5000 。 这个标准适合我当前的情况。

我想到的是

\d{4}$

虽然这工作,它也允许负值。

我如何确保只允许正整数?

你需要添加一个开始锚点^为:

 ^\d{4}$ 

您的正则expression式\d{4}$将匹配以4位数字结尾的string。 所以像-1234这样的input将被接受。

通过添加起始​​锚点,您只匹配那些以4位开头和结尾的string,这实际上意味着它们只能包含4位数字。

从1000年到2999年

 ^[12][0-9]{3}$ 

1900 – 2099年

 ^(19|20)\d{2}$ 

这个问题的“接受”答案既不正确也不近视。

这是不正确的,它会匹配像0001 ,这不是一个有效的年份string。

这是近视,它不会匹配任何高于9999的值。我们已经忘记了千年虫的教训吗? 相反,使用正则expression式:

 ^[1-9]\d{3,}$ 

如果你需要匹配过去几年,除了将来的几年,你可以使用这个正则expression式来匹配任何正整数:

 ^[1-9]\d*$ 

即使你不希望从过去的date,你可能会想要使用这个正则expression式,以防万一有人发明了时间机器,并想把你的软件带回去。

注意:这个正则expression式将匹配所有年份,包括那些在第一年之前的年份,因为它们通常用BC指定而不是负整数表示。 当然,这个约定在未来几千年可能会发生变化,所以你最好的select是把任何整数正数或负数与下面的正则expression式匹配:

 ^-?[1-9]\d*$ 

这适用于1900年至2099年:

 /(?:(?:19|20)[0-9]{2})/ 

build立在@ r92答案,1970 – 2019年:

 (19[789]\d|20[01]\d) 

你可以像[ ^-]\d{4}$ :防止减号-在你的4位之前。
你也可以用^\d{4}$^来捕获string的开头。 这实际上取决于你的情况

你可以把你的整数转换成一个string。 由于减号不符合数字,您将不会有负数年份。

我在Java中使用这个正则expression式^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

从1900年到9999年工作

/ ^ \ d {4} $ /这将检查一个string是否只包含4个数字。 在这种情况下,要input一年989,您可以改为0989。

要testing一年中包含其他字词的string以及年份,您可以使用以下正则expression式: \ b \ d {4} \ b