3

「DD/MM/YYYY」のようなユーザーが入力した日付形式を検証する正規表現を作成しようとしています(日付検証ではありません)

私は正規表現は初めてですが、これまでのところ次のものがあります。

(D{2}|M{2}|Y{2,4})[-|/]?(D{2}|M{2})[-|/]?(D{2}|M{2}|Y{2,4})

これは、次の日付形式と一致します。

  • DD/MM/YYYY
  • MM/DD/YYYY
  • DD-MM-YYYY
  • MM-DD-YYYY
  • DDMMYYYY
  • MMDDYYYY
  • YYYYMMDD
  • YYYYDDMM
  • YYYY/MM/DD
  • YYYY/DD/MM
  • YYYY-MM-DD
  • YYYY-DD-MM
  • 日/月/年
  • 月/日/年
  • DD-MM-YY
  • MM-DD-YY
  • DDMMYY
  • MMDDYY
  • 年月日
  • YYDDMM
  • 年月日
  • YY/DD/MM
  • YY-MM-DD
  • YY-DD-MM

残念ながら、次のものにも一致します。

  • DDMMDD
  • YYMMYYYY
  • むむむむ

最初のリストで指定された形式のみを一致させる方法はありますか? RegEx は VBA フォーム検証で使用されます。

4

2 に答える 2

2

負の後方参照を使用して、以前のエントリを繰り返さないようにすることができます。

^(D{2}|M{2}|(YY){1,2})[-|\/]?(?!\1)(D{2}|M{2})[-|\/]?((?!\1|\3)(D{2}|M{2}|(YY){1,2}))$

負の後方参照 (?!\1) & (?!\1|\3) は、エントリの繰り返しを防ぎます。

また、Y{2,4} は 'YYY' に一致するので、(YY){1,2} に変更しました。

于 2013-07-30T13:59:19.777 に答える
0

VBA についてはテストされていませんが、これはどうでしょうか。

^(((MM(?<s>[-/])?DD|DD(?<s>[-/])?MM)(?(s)[-/])?(YY|YYYY))|((YY|YYYY)(?<s>[-/])?(MM(?(s)[-/])DD|DD(?(s)[-/])MM)))$

考えられるプロセスは、区切り記号と年の桁数を無視した 4 つの可能な組み合わせがあるということでした。これらは:

DMY

MDY

YMD

YDM

したがって、これは 2 つのグループに分けることができます。最初の年と最後の年です。

^
(((MM(?<s>[-/])?DD|DD(?<s>[-/])?MM)(?(s)[-/])?(YY|YYYY))
|
((YY|YYYY)(?<s>[-/])?(MM(?(s)[-/])DD|DD(?(s)[-/])MM)))
$

また、少なくとも 2 つの同じ文字が存在することを確認するために、セパレーターに名前付きのキャプチャ グループを追加します。

于 2013-07-30T13:29:31.477 に答える