给定一个值,我想验证它是否是有效的年份。我的标准很简单,其中值应为带4
字符的整数。我知道这不是最好的解决方案,因为它不会允许几年以前的时间,1000
而且会允许诸如此类的时间5000
。这个标准足以满足我目前的情况。
我想出的是
\d{4}$
尽管这可行,但它也允许负值。
如何确保只允许使用正整数?
给定一个值,我想验证它是否是有效的年份。我的标准很简单,其中值应为带4
字符的整数。我知道这不是最好的解决方案,因为它不会允许几年以前的时间,1000
而且会允许诸如此类的时间5000
。这个标准足以满足我目前的情况。
我想出的是
\d{4}$
尽管这可行,但它也允许负值。
如何确保只允许使用正整数?
Answers:
您需要添加起始锚^
为:
^\d{4}$
您的正则表达式\d{4}$
将匹配以4位数字结尾的字符串。因此,类似的输入-1234
将被接受。
通过添加起始锚,您只能匹配以4位数字开头和结尾的字符串,这实际上意味着它们必须仅包含4位数字。
whateverblahblah2323
。现在,我明白了为什么学习有些危险:O
10000
将是一个错误。
从1000年到2999年
^[12][0-9]{3}$
1900-2099年
^(19|20)\d{2}$
^(?:19|20)\d{2}$
(19|20)\d{2}
我的正则表达式以验证生日格式?这是我的正则表达式,/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
我要确保该年份始终为4位数字,并以19 **或20 **开头
该问题的“可接受”答案既不正确又近视。
这是不正确的,因为它将匹配诸如的字符串0001
,这不是有效的年份。
这是近视的,因为它将不匹配任何高于9999的值。我们是否已经忘记了Y2K的课程?而是使用正则表达式:
^[1-9]\d{3,}$
如果您需要匹配过去的年份,以及未来的年份,则可以使用此正则表达式匹配任何正整数:
^[1-9]\d*$
即使您不希望看到过去的日期,也可能仍要使用此正则表达式,以防万一有人发明了一种时光机并希望将您的软件带回去。
注意:此正则表达式将匹配所有年份,包括第一年之前的年份,因为它们通常用BC名称而不是负整数表示。当然,此约定可能在接下来的几千年中发生变化,因此,最佳选择是使用以下正则表达式匹配任何整数(正数或负数):
^-?[1-9]\d*$
适用于1900年到2099年:
/(?:(?:19|20)[0-9]{2})/
基于1970-2019年的@ r92答案:
(19[789]\d|20[01]\d)
197999
19[789]\d\d\d
将允许197999
/(19[789]\d|20[01]\d)/.test(1970324) >> true
1970
),而不是最后3个数字(19[789]\d|20[01]\d)[^0-9]
。那会匹配,1970 324
但不会匹配1970324
理论上,4位数选项是正确的。但实际上,最好具有1900-2099的射程。
另外,它必须是非捕获组。许多评论和答案建议捕获不正确的恕我直言的分组。因为它可能匹配,但是为了使用正则表达式提取匹配项,由于括号的原因,它将提取4位数字和两位数字(19和20)。
这将适用于使用非捕获组的精确匹配:
(?:19|20)\d{2}
使用;
^(19|[2-9][0-9])\d{2}$
适用于1900年-9999年。
无需担心9999及更高版本-届时AI将完成所有编程!呵呵呵呵
您可以在https://regex101.com/上测试您的正则表达式
有关非捕获组的更多信息(在上面的评论中提到),请访问http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
如果您需要匹配YYYY或YYYYMMDD,则可以使用:
^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
您也可以使用这个。
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
00/00/2000
或31/02/1999
还有更多错误的日期。
(0[1-9]|1[0-2])
对于一个月一个更好的表达