私は実際にこの正規表現をあちこちに置いていましたが、しばらく前に友人との競争として作成しました!
以下は私の友人のもので、約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])))
これがうまくいくことを願っています。