63

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 で繰り返すものはありません

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;

他の言語にも同様の機能があります。1 桁の月などの値を受け入れたい場合は、正規表現にマイナーな変更を加える必要があることに注意してください。

于 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 月の日数は、うるう年についても検証されます。日付: 1600 年 1 月 1 日から 9999 年 12 月 31 日までの dd/mm/yyyy または d/m/yy 形式。先行ゼロはオプションです。日付の区切り記号は、ダッシュ (-)、スラッシュ (/)、またはピリオド (.) のいずれかです。 :MM:ss 軍用時間形式 (00:00:00 - 23:59:59)。12 時間形式: 1) 時間の先頭に 0 が含まれる場合があります。2) 12 時間制の場合、分と秒はオプションです。3) AM または PM は必須で、大文字と小文字が区別されます。ミリタリー タイムは、1) 10 時間未満のすべての時間の前に 0 を付ける必要があります。2) 分は必須です。3) 秒はオプションです。日時: 上記の形式の組み合わせ。最初に日付、次にスペースで区切られた時刻。例)dd/mm/yyyy hh:MM:ss


編集: StackOverflow は特殊文字を削除/破棄することがあるため、regexlib.com Web サイトから RegEx をコピーしてください。

于 2008-09-01T11:03:12.113 に答える
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 の Imran の回答に関しては、欠落があります。パターンでは、正しいパターンは次のとおりです。

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 に答える
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 に答える
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 に答える
-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');

datetime のみを含む行を照合する必要がある場合は、正規表現の先頭と末尾に ^ と $ を追加します。

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

正規表現の視覚化

Debuggex デモ

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

于 2016-10-19T07:12:57.313 に答える