datetime (2008-09-01 12:35:45 ) 的正则表达式模式是什么?

What is the regex pattern for datetime (2008-09-01 12:35:45 )?

提问人:Alexander Morland 提问时间:9/1/2008 最后编辑:abatishchevAlexander Morland 更新时间:11/19/2022 访问量:180285

问:

DateTime (2008-09-01 12:35:45 ) 的正则表达式模式是什么?

我收到此错误:

未找到结束分隔符“^”

用:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

给出此错误:

警告:preg_match() [function.preg-match]:编译失败:在第 19 行 E:\www\index.php 的偏移量 0 处没有可重复的内容

php 正则表达式 datetime

评论


答:

9赞 Espo 9/1/2008 #1

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$


此 RE 验证日期和/或 时间模式。2月的日子也是 已验证闰年。日期: 在 dd/mm/yyyy 或 d/m/yy 格式介于 DD/MM/YY 之间 1/1/1600 - 31/12/9999.前导零 是可选的。日期分隔符可以是 匹配破折号(-),斜杠(/) 或句点(.)时间:在hh:MM:ss AM/PM 12 小时制(12:00 AM - 11:59:59 PM) 或 hh:MM:ss 军事时间 格式 (00:00:00 - 23:59:59)。这 12 小时时间格式:1)可能有一个 领先零小时。2) 会议纪要 秒数是可选的 12 小时格式 3) 需要上午 或下午 并且区分大小写。军事时间 1) 所有小时都必须有一个前导零 小于 10。2) 会议记录是 强制性的。3) 秒数是可选的。 日期时间:上述各项的组合 格式。先是日期,然后是时间 由空格隔开。例如)日/月/年 hh:MM:ss


编辑:确保从 regexlib.com 网站复制正则表达式,因为 StackOverflow 有时会删除/销毁特殊字符。

评论

0赞 Murilo Garcia 3/19/2016
这个答案提供了一个很好的正则表达式,但不是实际问题的答案。问题是验证以“-”分隔的日期,而不是此答案所描述的“/”。
32赞 Tom 9/1/2008 #2

一个简单的版本,适用于上述格式,但不适用于@Espos所有其他格式:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

评论

0赞 chiliNUT 12/17/2014
加上一个最简单的解决方案!
0赞 iRector 11/28/2017
这个验证 0000-00-00 00:00:00 和 0000-00-00 00:00 (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})?((:)?(\d{2}))
90赞 Greg Hewgill 9/1/2008 #3

@Espo:我不得不说正则表达式太不可思议了。我讨厌必须编写对匹配项有用的东西的代码,例如,如果您想实际找出用户键入的日期和时间。

Tom 的解决方案似乎更站得住脚,因为它要简单无数倍,并且通过添加一些括号,您可以轻松获得用户键入的值:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

如果你使用的是 perl,那么你可以用这样的东西来获取值:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

其他语言将具有类似的功能。请注意,如果您想接受个位数月份等值,则需要对正则表达式进行一些小修改。

评论

9赞 darkheir 10/21/2012
只是一个注释,说这个正则表达式不会检测日期、月份或时间是否具有优于最大值的值。例如,2012-65-65 99:99:99 将起作用。除此之外,正则表达式很棒!
5赞 Greg Hewgill 3/5/2014
显示的正则表达式不用于验证日期。它旨在检查字符串的语法,看看它是否看起来像一个日期。获取值后,您可以使用普通日期库函数验证给定日期。
4赞 1/31/2019
这个正则表达式将在 7981 年后打破
0赞 Swaru 7/8/2020
这个正则表达式甚至给出了像 2020-99-99 99:99:99 这样的日期的匹配,正如 @darkheir 所提到的,这是不正确的
-1赞 Imran 9/1/2008 #4

PHP preg 函数需要用分隔符(可以是任何字符)包装正则表达式。如果不在正则表达式中转义,则无法使用此分隔符。这应该有效(这里的分隔符是 /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

如果需要匹配仅包含日期时间的行,请在正则表达式的开头和结尾添加 ^ 和 $。

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

链接到 PHP 手册的 preg_match()

2赞 deni 1/19/2011 #5

关于伊姆兰的回答 从 九月 1th 2008 在 12:33 模式中缺少一个 : 正确的模式是

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

这将返回

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 
5赞 Javad Yousefi 8/3/2012 #6
^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$

评论

0赞 Axi 9/18/2018
使用这个略有修改,允许日期在 2000 年之前:“^(\d{4}-([0]\d|[1][0-2])-([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$”
6赞 Philip 4/2/2014 #7
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$matches将是:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

一种分解日期时间格式字符串的简单方法。

-2赞 Duc Tran 7/11/2014 #8

这是一个简化版本(源自 Espo 的回答)。它检查日期(甚至闰年)的正确性,hh:mm:ss 是可选
的 有效的示例: - 2003-12-31 11:59:
59 -
2004-2-29

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
0赞 Tornike 9/30/2015 #9

这是我的解决方案:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u
-1赞 Yeongjun Kim 10/19/2016 #10

这是我的解决方案:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

正则表达式可视化

Debuggex 演示

https://regex101.com/r/lbthaT/4

0赞 themepark 11/28/2016 #11

我修改了 http://regexlib.com/REDetails.aspx?regexp_id=610 的正则表达式模式。以下模式应与您的情况相匹配。

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

YYYY-MM-DD HH:MM:SS

评论

0赞 Axi 9/18/2018
这个也匹配 YYYY-MM-DD
2赞 Milkncookiez 5/19/2020 #12

补充@Greg Hewgill 答案:如果您希望能够同时匹配日期时间并且匹配日期,则可以使正则表达式的“时间”部分可选:

(\d{4})-(\d{2})-(\d{2})( (\d{2}):(\d{2}):(\d{2}))?

这样,您将匹配两者和2008-09-01 12:35:422008-09-01

2赞 Seongjoo Park 8/10/2022 #13

具有验证功能的简单正则表达式 DateTime

^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$

但它不能包含不包括 31 天的验证月份(例如 2022-11-31、2022-02-30)

0赞 ali t 11/19/2022 #14

这是我的答案:

[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])