99

给定一个值,我想验证它以检查它是否是有效的年份。我的标准很简单,值应该是带有4字符的整数。我知道这不是最好的解决方案,因为它不会允许多年前,1000并且会允许像5000. 这个标准对于我目前的情况来说已经足够了。

我想出的是

\d{4}$

虽然这可行,但它也允许负值。

如何确保只允许正整数?

4

16 回答 16

197

从 1000 年到 2999 年

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

1900-2099 年

^(19|20)\d{2}$
于 2010-12-07T07:18:27.137 回答
88

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

^\d{4}$

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

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

于 2010-12-07T07:15:29.930 回答
22

这个问题的“公认”答案既不正确又短视。

这是不正确的,因为它将匹配字符串,例如0001,这不是有效的年份。

这是短视的,因为它不会匹配任何高于 9999 的值。我们是否已经忘记了Y2K的教训?相反,使用正则表达式:

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

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

^[1-9]\d*$

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

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

^-?[1-9]\d*$
于 2012-09-03T00:34:30.473 回答
12

这适用于 1900 到 2099:

/(?:(?:19|20)[0-9]{2})/
于 2015-02-01T07:44:01.927 回答
6

在 1970-2019 年的 @r92 答案的基础上:

(19[789]\d|20[01]\d)
于 2013-06-27T09:35:37.617 回答
3

要测试包含其他单词和年份的字符串中的年份,您可以使用以下正则表达式:\b\d{4}\b

于 2017-06-09T12:18:36.777 回答
2

从理论上讲,4 位选项是正确的。但在实践中,最好有 1900-2099 的范围。

此外,它需要是非捕获组。许多评论和答案建议捕获不适合恕我直言的分组。因为为了匹配它可能会起作用,但是对于使用正则表达式提取匹配,它也会因为括号而提取 4 位数字和两位(19 和 20)数字。

这将适用于使用非捕获组的精确匹配:

(?:19|20)\d{2}

于 2018-04-16T08:59:11.903 回答
1

您可以使用 [ 之类的东西^-]\d{4}$:您可以防止减号-出现在您的 4 位数字之前。
您还可以使用^\d{4}$with^来捕获字符串的开头。这实际上取决于您的情况...

于 2010-12-07T07:17:30.357 回答
1

采用;

^(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

于 2018-05-11T08:52:57.090 回答
0

您可以将整数转换为字符串。由于减号与数字不匹配,因此您将没有负数。

于 2010-12-07T07:19:00.563 回答
0

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

作品从 1900 年到 9999 年

于 2015-01-22T06:41:33.743 回答
0

/^\d{4}$/ 这将检查字符串是否仅包含 4 个数字。在这种情况下,要输入年份 989,您可以改为输入 0989。

于 2017-04-18T09:49:38.630 回答
0

如果您需要匹配 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})$
于 2018-06-19T15:09:52.500 回答
0

你也可以使用这个。

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
于 2019-08-20T11:45:12.633 回答
0

就我而言,我想匹配一个以年份(4 位数字)结尾的字符串,例如:

Oct 2020
Nov 2020
Dec 2020
Jan 2021

它会true带着这个返回:

var sheetName = 'Jan 2021';
var yearRegex = new RegExp("\b\d{4}$");
var isMonthSheet = yearRegex.test(sheetName);
Logger.log('isMonthSheet = ' + isMonthSheet);

上面的代码在Apps Script中使用。

这是测试上述正则表达式的链接:https ://regex101.com/r/SzYQLN/1

于 2021-01-07T13:45:06.020 回答
0

您可以尝试以下方法从字符串中捕获有效年份:

.*(19\d{2}|20\d{2}).*
于 2021-09-09T18:18:53.947 回答