正则表达式以YYYY-MM-DD格式匹配日期

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

我所拥有的是: [\ d] {4} - [\ d] {2} - [\ d] {2} </ code> </ p>
\ n

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

非常感谢任何帮助。</ p>
</ div>

展开原文

原文

I have a regular expression in PHP that looks for the date in the format of YYYY-MM-DD

What I have is: [\d]{4}-[\d]{2}-[\d]{2}

I'm using preg_match to test the date, the problem is that 2009-11-10 works, but 2009-11-1033434 works as well. It's been awhile since I've done regex, how do I ensure that it stops at the correct spot? I've tried doing /([\d]{4}-[\d]{2}-[\d]{2}){1}/, but it returns the same result.

Any help would be greatly appreciated.

7个回答



您需要的是锚点,特别是 ^ </ code>和 $ </ code>。 前者匹配字符串的开头,后者匹配结束。</ p>

我要做的另一点是 [] </ code>是不必要的。 \ d </ code>在字符范围之外保留其含义。</ p>

所以你的正则表达式应如下所示: / ^ \ d {4} - \ d { 2} - \ d {2} $ / </ code>。</ p>
</ div>

展开原文

原文

What you need is anchors, specifically ^ and $. The former matches the beginning of the string, the latter matches the end.

The other point I would make is the [] are unnecessary. \d retains its meaning outside of character ranges.

So your regex should look like this: /^\d{4}-\d{2}-\d{2}$/.



您如何期望终止日期?</ p>

如果是行尾 ,然后一个 $ </ code>应该可以解决问题。</ p>

如果是一个非数字字符,那么下面的负数断言 (?!\ d)</ code>同样有效。</ p>
</ DIV>

展开原文

原文

How do you expect your date to be terminated ?

If an end-of-line, then a following $ should do the trick.

If by a non-digit character, then a following negative assertion (?!\d) will similarly work.

dqh19413
dqh19413 啊。 当然。 纠正。 谢谢。
接近 11 年之前 回复
douwei2825
douwei2825 使用[^ \ d]将捕获非数字字符。 使用负前瞻断言会更好,如(?!\ d)
接近 11 年之前 回复



您可能需要向前看断言(假设您的引擎支持它们,php / preg / pcre会这样做)</ p>

向前看断言(或肯定断言)允许你说“它应该跟随X,但X不应该是匹配的一部分。”尝试以下语法</ p>

< 预> <代码> \ d {4} - \ d {2} - \ d {2}
</代码> </ PRE>

在(= [^ 0-9]?) 断言是这部分</ p>

 (?= [^ 0-9])
</ code> </ pre>

它说“在我之后 正则表达式,下一个字符不能是数字“</ p>

如果这不能得到你想要/需要的东西,请发布你的输入和你的PHP代码不能正常工作的例子。 这两个项目在调试这些问题时非常有用。</ p>
</ div>

展开原文

原文

You probably want look ahead assertions (assuming your engine supports them, php/preg/pcre does)

Look ahead assertions (or positive assertions) allow you to say "and it should be followed by X, but X shouldn't be a part of the match). Try the following syntax

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

The assertion is this part

(?=[^0-9])

It's saying "after my regex, the next character can't be a number"

If that doesn't get you what you want/need, post an example of your input and your PHP code that's not working. Those two items can he hugely useful in debugging these kinds of problems.

dongzhanyan3667
dongzhanyan3667 如果遇到字符串的结尾,正向前瞻断言将失败。 使用像(?!\ d)这样的负向前瞻断言更好。
接近 11 年之前 回复



你可能想把锚点放在表达式上。
i.e。</ p>

   ^ [\ d] {4}  -  [\ d] {2}  -  [\ d] {2} $ 
</ code> </ pre>

请注意插入符号和美元 签署。</ p>
</ div>

展开原文

原文

you're probably wanting to put anchors on the expression. i.e.

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

note the caret and dollar sign.



[\ d] {4} - [\ d] {2} - [\ d] {2}?< / code> </ p>

问号的意思是“非贪婪”</ p>
</ div>

展开原文

原文

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

where the question mark means "non-greedy"

dtlygweb2017
dtlygweb2017 好吧,我没有完全疯了,只有一点点;-)我了解EOL概念,并按照你描述的方式理解它。 但我想:他显然有一个像abcdef2009-11-1033434abcdef这样的字符串。与正则表达式匹配2009-11-1033434。 那么为什么EOL(或此上下文中的字符串结尾)会触发?
接近 11 年之前 回复
duan246558
duan246558 因为$匹配字符串的结尾。 \ d {2}匹配两位数,但不说该字符串必须停在那里。 \ d {2} $表示“匹配两位数,然后确保我们已到达字符串的末尾”。 好吧,更具体的是,^和$实际上在多行上下文中匹配行开头/结尾,但在非多行上下文中,它们匹配字符串开头/结尾。 还有\ A和\ z(或\ Z),无论多行上下文如何,它始终匹配字符串开头/结尾。
接近 11 年之前 回复
duanbeng8872
duanbeng8872 B:thx。 但是为什么$ EOL在最初的2009-11-1033434例子中工作而不是{2}?
接近 11 年之前 回复
doushan2224
doushan2224 \ d {2}? 和\ d {2}是相同的。 {2}已明确表示匹配这些原子中的2个,因此该组的贪婪无效。
接近 11 年之前 回复



  ^ 20 [0-2] [0-9]  - ((0 [1-9])|(1  [0-2])) - ([0-2] [1-9] | 3 [0-1])$ ​​
</ code> </ pre>

我添加了一点额外的 检查以帮助解决用户混淆的 MM </ code>和 DD </ code>问题。 这并没有捕获所有日期混合,但确实将 YYYY </ code>部分保存在 2000 </ code>和 2029 </ code>之间, MM </ code> 在 01 </ code>和 12 </ code>之间以及 01 </ code>和 31 </ code> </ p>之间的 DD </ code>之间
</ div>

展开原文

原文

^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$

I added a little extra check to help with the issue of MM and DD getting mixed up by the user. This doesn't catch all date mixups, but does keeps the YYYY part between 2000 and 2029, the MM between 01 and 12 and the DD between 01 and 31

dtcaw02086
dtcaw02086 这很有用但是有一个小错误 - 它排除了第10天和第20天。它应该使用:^ 20 [0-2] [0-9] - ((0 [1-9])|(1 [0-2] ])) - (0 [1-9] | [1-2] [0-9] | 3 [0-1])$
3 年多之前 回复



您可以尝试在表达式的开头和结尾添加“^”和“$”符号:</ p>

 <代码> / ^ [\ d] {4}  -  [\ d] {2}  -  [\ d] {2} $ / 
</代码> </ PRE>
\ n

分别匹配字符串的开头和结尾。</ p>
</ div>

展开原文

原文

You could try putting both a '^' and a '$' symbol at the start and end of your expression:

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

which match the start and the end of the string respectively.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐