正则表达式匹配以测试有效年份

Ran*_*ray 76 regex string validation string-matching

给定一个值我想验证它是否有效年份.我的标准很简单,其值应为带4字符的整数.我知道这不是最好的解决方案,因为它不会允许多年,1000并且会允许多年如此5000.这个标准适合我目前的情况.

我想出的是

\d{4}$

虽然这有效但它也允许负值.

如何确保只允许正整数?

r92*_*r92 161

年份从1000到2999

^[12][0-9]{3}$
Run Code Online (Sandbox Code Playgroud)

1900年至2099年

^(19|20)\d{2}$
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的解决方案 (12认同)
  • 我最好使用非捕获组:`^(?:19 | 20)\ d {2} $` (8认同)

cod*_*ict 72

您需要添加一个起始锚点^:

^\d{4}$
Run Code Online (Sandbox Code Playgroud)

您的正则表达式\d{4}$将匹配以4位数结尾的字符串.所以输入-1234就会被接受.

通过添加起始​​锚,您只匹配以4位开头和结尾的字符串,这实际上意味着它们必须只包含4位数.

  • 这将在万年中破裂. (53认同)
  • @sferik:没关系.原始海报明确表示他想检查四个字符.他并没有说他希望10,000年成为有效输入,所以接受"10000"将是一个错误. (14认同)
  • 该死的!我的是如此有缺陷,以至于它甚至会接受“ whateverblahblah2323”。现在我明白了为什么学习有点危险:O (2认同)
  • @sferik:到那时,该计划将会消失几个世纪.如果没有,最好担心将来9000年.遵循YAGNI的原则,该方法是有效的. (2认同)

sfe*_*rik 21

这个问题的"接受"答案既错误又近视.

这是不正确的,它将匹配字符串0001,这不是一个有效的年份.

它是近视的,它不会匹配9999以上的任何值.我们是否已经忘记了Y2K的教训?相反,使用正则表达式:

^[1-9]\d{3,}$
Run Code Online (Sandbox Code Playgroud)

如果您需要匹配过去的年份,除了将来的年份之外,您可以使用此正则表达式来匹配任何正整数:

^[1-9]\d*$
Run Code Online (Sandbox Code Playgroud)

即使你不期望过去的日期,你也可能想要使用这个正则表达式,以防万一有人发明了一台时间机器,并希望带回你的软件.

注意:此正则表达式将匹配所有年份,包括第1年之前的年份,因为它们通常用BC指定而不是负整数表示.当然,这个约定可能会在接下来的几千年内发生变化,因此您最好的选择是将任何整数正数或负数与以下正则表达式匹配:

^-?[1-9]\d*$
Run Code Online (Sandbox Code Playgroud)

  • 不,它可能不会.但有人(考古学家?历史学家?)可能需要与8000年前的年代相匹配.:D和布朗博士可能需要它...... (2认同)

jon*_*ert 9

这适用于1900年至2099年:

/(?:(?:19|20)[0-9]{2})/
Run Code Online (Sandbox Code Playgroud)


Ren*_*aud 6

以@r92 答案为基础,1970-2019 年:

(19[789]\d|20[01]\d)
Run Code Online (Sandbox Code Playgroud)