yyyy-mm-dd形式の日付を一致させる正規表現
-
19-09-2019 - |
質問
yyyy-mm-ddの形式で日付を探すPHPで正規表現があります
私が持っているのは: [\d]{4}-[\d]{2}-[\d]{2}
preg_matchを使用して日付をテストしていますが、問題は 2009-11-10
作品、しかし 2009-11-1033434
同様に機能します。 Regexをやってからしばらく経ちましたが、正しい場所で止まることを確認するにはどうすればよいですか?やってみました /([\d]{4}-[\d]{2}-[\d]{2}){1}/
, 、しかし、それは同じ結果を返します。
どんな助けも大歓迎です。
解決
必要なのは、特にアンカーです ^
と $
. 。前者は文字列の始まりと一致し、後者は終わりと一致します。
私がするもう一つのポイントはです []
不要です。 \d
キャラクターの範囲外でその意味を保持します。
したがって、あなたの正規表現は次のようになるはずです: /^\d{4}-\d{2}-\d{2}$/
.
他のヒント
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$
の問題を支援するために少し余分なチェックを追加しました MM
と DD
ユーザーが混同します。これはすべての日付の混乱をキャッチするわけではありませんが、 YYYY
その間の部分 2000
と 2029
, 、 MM
の間に 01
と 12
そしてその DD
の間に 01
と 31
あなたはおそらく表現にアンカーを置きたいと思っています。すなわち
^[\d]{4}-[\d]{2}-[\d]{2}$
CARETとDOLLAR SIGNに注意してください。
[\d]{4}-[\d]{2}-[\d]{2}?
疑問符が「非グリーディ」を意味する場所
あなたはおそらく先を見たいと思うことを望んでいます(あなたのエンジンがそれらをサポートしていると仮定して、PHP/PREG/PCREはそうします)
先を見据えて、アサーション(または肯定的なアサーション)を使用すると、「xが続くべきですが、xは試合の一部であるべきではない」と言うことができます。次の構文を試してください。
\d{4}-\d{2}-\d{2}(?=[^0-9])
アサーションはこの部分です
(?=[^0-9])
それは「私の正規表現の後、次のキャラクターは数になることはできません」と言っています
それがあなたが望む/必要なものをあなたに取得しない場合、あなたの入力の例と動作していないあなたのPHPコードを投稿してください。これらの2つの項目は、これらの種類の問題をデバッグするのに非常に役立ちます。
表現の開始時と終了時に「^」と「$」記号の両方を試してみることができます。
/^[\d]{4}-[\d]{2}-[\d]{2}$/
それぞれ文字列の開始と終了と一致します。