0

dd-mm-yyyy日付形式の正規表現を知りたいです。そしてルールは

月が 4、6、9、11 のいずれかの場合、日は 30 以下、月が 2 で年が 4 で割り切れない、または割り切れる場合は、28 以下でなければなりません。 100 で 400 ではなく、月が 2 で年が 400 で割り切れる場合は 29 以下、または 4 で割り切れるが 100 で割り切れない場合は 29 以下。

xsd で xml regex を実行したかったのです。

承認 - 29-02-2000, 31-05-2013, 30-04-2012

拒絶 - 29-02-1900, 31-04-2013, 30-02-2000

4

2 に答える 2

6

私は実際にこの正規表現をあちこちに置いていましたが、しばらく前に友人との競争として作成しました!

以下は私の友人のもので、約20%高速です:

^(?!00)((([0-2]\d|3[01])-(0[13578]|1[02])|([0-2]\d|30)-(0[469]|11)|([01]\d|2[0-8])-02)-\d{4}|([01]\d|2\d)-02-(([02468][048]|[13579][26])(?=00)|\d{2}(?!00))([02468][048]|[13579][26]))$

これは最短ですが(私の課題であるTwitterに適合します):

^(?!(00|30-02))(((?=.+(?!00)([02468](?=[048](00)?$)|[13579](?=[26](00)?$)))|(?!29-02))[012]\d|30|31(?!-(0[2469]|11)))-(0[1-9]|1[012])-\d{4}$

両方の正規表現が の検証に失敗することに注意してくださいyyyy = 0000。これは、グレゴリオ暦による有効な年ではありません。

どちらの正規表現も、javascript で動作する必要があったため、後読みと条件分岐がありません。

編集:

これは XML に必要なので、最初の正規表現を少し変更しました。

((0[1-9]|[1-2]\d|3[01])-(0[13578]|1[02])|([0-2]\d|30)-(0[469]|11)|(0[1-9]|1\d|2[0-8])-02)-\d{4}|(0[1-9]|[12]\d)-02-(([02468][048]|[13579][26])00|(\d{2}([02468][48]|[2468][048]|[13579][26])))

これがうまくいくことを願っています。

于 2013-05-22T06:23:33.953 に答える