0

我在 PHP 中有一个正则表达式,它以 YYYY-MM-DD 格式查找日期

我所拥有的是:[\d]{4}-[\d]{2}-[\d]{2}

我正在使用 preg_match 来测试日期,问题是它2009-11-10有效,但2009-11-1033434也有效。自从我完成正则表达式以来已经有一段时间了,我如何确保它停在正确的位置?我试过做/([\d]{4}-[\d]{2}-[\d]{2}){1}/,但它返回相同的结果。

任何帮助将不胜感激。

4

7 回答 7

12

您需要的是锚点,特别是^$. 前者匹配字符串的开头,后者匹配结尾。

我要说的另一点[]是不必要的。\d在字符范围之外保留其含义。

所以你的正则表达式应该是这样的:/^\d{4}-\d{2}-\d{2}$/.

于 2009-11-10T22:36:27.670 回答
7
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$

我添加了一些额外的检查来帮助解决用户混淆MM的问题。DD这并没有捕捉到所有的日期混淆,但确实保留了and 、between and和between and之间的YYYY部分20002029MM0112DD0131

于 2016-03-28T20:54:05.293 回答
3

你希望你的约会如何被终止?

如果是行尾,那么以下$应该可以解决问题。

如果使用非数字字符,则以下否定断言 (?!\d)将同样起作用。

于 2009-11-10T22:35:51.030 回答
2

您可能想在表达式上放置锚点。IE

^[\d]{4}-[\d]{2}-[\d]{2}$

注意插入符号和美元符号。

于 2009-11-10T22:35:19.853 回答
1

[\d]{4}-[\d]{2}-[\d]{2}?

问号的意思是“非贪婪”

于 2009-11-10T22:37:04.750 回答
1

您可能想要前瞻断言(假设您的引擎支持它们,php/preg/pcre 支持)

前瞻断言(或肯定断言)允许你说“它后面应该跟着 X,但 X 不应该是匹配的一部分)。试试下面的语法

\d{4}-\d{2}-\d{2}(?=[^0-9])

断言是这部分

(?=[^0-9])

它是说“在我的正则表达式之后,下一个字符不能是数字”

如果这不能满足您的需求,请发布您的输入示例和您的 PHP 代码不起作用。这两个项目在调试这类问题时非常有用。

于 2009-11-10T22:43:50.280 回答
0

您可以尝试在表达式的开头和结尾同时放置一个 '^' 和一个 '$' 符号:

/^[\d]{4}-[\d]{2}-[\d]{2}$/

分别匹配字符串的开头和结尾。

于 2009-11-10T22:37:02.180 回答