给定一个值,我想验证它以检查它是否是有效的年份。我的标准很简单,值应该是带有4
字符的整数。我知道这不是最好的解决方案,因为它不会允许多年前,1000
并且会允许像5000
. 这个标准对于我目前的情况来说已经足够了。
我想出的是
\d{4}$
虽然这可行,但它也允许负值。
如何确保只允许正整数?
给定一个值,我想验证它以检查它是否是有效的年份。我的标准很简单,值应该是带有4
字符的整数。我知道这不是最好的解决方案,因为它不会允许多年前,1000
并且会允许像5000
. 这个标准对于我目前的情况来说已经足够了。
我想出的是
\d{4}$
虽然这可行,但它也允许负值。
如何确保只允许正整数?
从 1000 年到 2999 年
^[12][0-9]{3}$
1900-2099 年
^(19|20)\d{2}$
您需要添加一个起始锚点^
:
^\d{4}$
您的正则表达式\d{4}$
将匹配以 4 位数字结尾的字符串。所以输入喜欢-1234
将被接受。
通过添加起始锚点,您只匹配那些以 4 位数字开头和结尾的字符串,这实际上意味着它们必须只包含 4 位数字。
这个问题的“公认”答案既不正确又短视。
这是不正确的,因为它将匹配字符串,例如0001
,这不是有效的年份。
这是短视的,因为它不会匹配任何高于 9999 的值。我们是否已经忘记了Y2K的教训?相反,使用正则表达式:
^[1-9]\d{3,}$
如果你需要匹配过去的年份,除了未来的年份,你可以使用这个正则表达式来匹配任何正整数:
^[1-9]\d*$
即使您不希望有过去的日期,您也可能希望使用这个正则表达式,以防有人发明了一台时间机器并想要带回您的软件。
注意:此正则表达式将匹配所有年份,包括第 1 年之前的年份,因为它们通常用 BC 指定而不是负整数表示。当然,这种约定可能会在接下来的几千年中发生变化,因此您最好的选择是使用以下正则表达式匹配任何整数(正数或负数):
^-?[1-9]\d*$
这适用于 1900 到 2099:
/(?:(?:19|20)[0-9]{2})/
在 1970-2019 年的 @r92 答案的基础上:
(19[789]\d|20[01]\d)
要测试包含其他单词和年份的字符串中的年份,您可以使用以下正则表达式:\b\d{4}\b
从理论上讲,4 位选项是正确的。但在实践中,最好有 1900-2099 的范围。
此外,它需要是非捕获组。许多评论和答案建议捕获不适合恕我直言的分组。因为为了匹配它可能会起作用,但是对于使用正则表达式提取匹配,它也会因为括号而提取 4 位数字和两位(19 和 20)数字。
这将适用于使用非捕获组的精确匹配:
(?:19|20)\d{2}
您可以使用 [ 之类的东西^-]\d{4}$
:您可以防止减号-
出现在您的 4 位数字之前。
您还可以使用^\d{4}$
with^
来捕获字符串的开头。这实际上取决于您的情况...
采用;
^(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
您可以将整数转换为字符串。由于减号与数字不匹配,因此您将没有负数。
我在 Java 中使用这个正则表达式^(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}$/ 这将检查字符串是否仅包含 4 个数字。在这种情况下,要输入年份 989,您可以改为输入 0989。
如果您需要匹配 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)
就我而言,我想匹配一个以年份(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
您可以尝试以下方法从字符串中捕获有效年份:
.*(19\d{2}|20\d{2}).*