2016-09-28 3 views
0

だから私は、私ならば、私は思っていた日付フィールド(YYYY/DD/MM)互換正規表現の場

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

(YYYY/MM/DD)

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

を持っていますDDとMMの部品を交換可能にすることができますので、別々に表現する必要はありません。私はYYYYの後にOR関数を使うことができると知っていますが、私は本当に両方のフォーマットを最短のパターンで取り込むことができる正規表現を持っていたいと思います。

regex1|regex2 

その後、あなたは相互の「接頭辞」と「接尾辞」を抽出することができます

+0

号。正確にどのように '2016/03/04'と' 2016/04/03'を区別する予定ですか?どちらも完全に有効ですが、3月4日と4月3日は全く同じ日付ではありません。 **これだけの方法は、13日から28日、29日、30日、31日のみ有効となるように、1日から12日に何かが起こることを禁じた場合です。 –

+0

だから、YYYY/MM/DDの3番目の\ d \ dを先読みし、それが本当にDDかMMかどうかを調べる正規表現に条件付き論理を作りたいのですか?しかし、@ MarkBが書いているように、07が7月か7日であるときは、どうやって分かるでしょうか? 1997/07/07はどうですか?どうやって決めるの? –

答えて

0

最も簡単な方法は、regex1とregex2を取ると、このように一緒にそれらを投げることです。あなたのケースでは:

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

ここで私は?|分岐リセットを使用します。

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

\dがあなたの目的のために[0-9]と同じであると仮定すると、あなたは少しことを短縮することができます

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

これはオリジナルのregに最も近いものですexes。


一方、検証の一部を省略することもできます。その日と一致する部分もすべての月に一致します。

この正規表現:

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

[-/]に分割することは簡単ですので)あなたがグループをキャプチャする気にしないのであれば、あなたが使用することができます。

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

それはすべてのものと一致します古い正規表現は一致した。欠点は、それはまたのように「日付」と一致していることである:

もちろん
2000/31/30 

、最短正規表現を(理由以内、それ以外の場合は.*だ)のようになります:あなたがすることはできません

^(\d{2}){1,2}([-/]\d{1,2}){2}$