63

DateTime (2008-09-01 12:35:45) 的 RegEx 模式是什么?

我收到此错误:

未找到结束分隔符 '^'

使用:

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 处没有重复内容

4

12 回答 12

78

@Espo:我不得不说正则表达式令人难以置信。我不想编写对匹配有用的代码,例如,如果您想实际找出用户输入的日期和时间。

似乎汤姆的解决方案会更站得住脚,因为它简单了很多倍,并且通过添加一些括号,您可以轻松地获得用户键入的值:

(\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;

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

于 2008-09-01T11:23:07.433 回答
27

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

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 
于 2008-09-01T11:14:40.200 回答
7

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 格式,介于 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) AM 或 PM 是必需的并且区分大小写。军用时间 1) 小于 10 的所有小时必须有前导零。2) 分钟是强制性的。3) 秒是可选的。日期时间:上述格式的组合。先是日期,然后是由空格分隔的时间。例如)dd/mm/yyyy hh:MM:ss


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

于 2008-09-01T11:03:12.113 回答
6
$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
)

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

于 2014-04-01T23:11:26.380 回答
4
^([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)$
于 2012-08-03T11:27:34.607 回答
1

关于伊姆兰在 2008 年 9 月 1 日 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 ) 
于 2011-01-18T18:19:36.430 回答
1

添加到@Greg Hewgill 答案:如果您希望能够同时匹配日期时间和唯一日期,您可以将正则表达式的“时间”部分设为可选:

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

这样,您将同时匹配2008-09-01 12:35:422008-09-01

于 2020-05-19T10:03:40.367 回答
0

这是我的解决方案:

/^(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
于 2015-09-30T13:45:03.103 回答
0

我已经从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

于 2016-11-28T10:33:36.403 回答
-1

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()

于 2008-09-01T12:33:36.657 回答
-1

这是我的解决方案:

[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

正则表达式可视化

调试演示

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

于 2016-10-19T07:12:57.313 回答
-2

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

^(?=\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})?$
于 2014-07-11T03:36:59.247 回答