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

时间:2010-12-07 07:13:22

标签: regex string validation string-matching

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

我想出的是

\d{4}$

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

如何确保只允许正整数?

14 个答案:

答案 0 :(得分:148)

1000至2999年

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

1900-2099

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

答案 1 :(得分:67)

您需要将起始锚^添加为:

^\d{4}$

您的正则表达式\d{4}$将匹配以4位结尾的字符串。因此,-1234之类的输入将被接受。

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

答案 2 :(得分:21)

这个问题的“接受”答案既错误又近视。

这是不正确的,因为它会匹配0001之类的字符串,这不是有效的年份。

它的近视是匹配9999以上的任何值。我们已经忘记了Y2K的教训吗?而是使用正则表达式:

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

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

^[1-9]\d*$

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

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

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

答案 3 :(得分:9)

这适用于1900年至2099年:

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

你可以像{^-]\d{4}$一样使用:你可以防止减号-在你的4位数之前。
您还可以使用^\d{4}$^来捕获字符串的开头。这实际上取决于你的情景...

答案 6 :(得分:1)

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

答案 7 :(得分:1)

理论上,4位数选项是正确的。但在实践中,拥有1900-2099范围可能会更好。

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

这适用于使用非捕获组进行精确匹配:

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

答案 8 :(得分:0)

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

答案 9 :(得分: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年工作

答案 10 :(得分:0)

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

答案 11 :(得分: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})$

答案 12 :(得分:0)

您也可以使用此。

 backgrund-image:linear-gradient(red,red),linear-gradient(blue,blue);
 background-position:left,top;
 background-size:100% 50px,50px 20px;
 background-color:yellow;

答案 13 :(得分: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