3

我正在寻找一个正则表达式来验证用户输入的日期格式,如“DD/MM/YYYY”(不是日期验证)

我是 RegEx 的新手,但到目前为止我有以下内容:

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

这与以下日期格式匹配:

  • 日/月/年
  • 月/日/年
  • DD-MM-YYYY
  • MM-DD-YYYY
  • DDMMYYYY
  • MMDDYYYY
  • YYYYMMDD
  • YYYYDDMM
  • 年年/月/日
  • YYYY/DD/MM
  • YYYY-MM-DD
  • YYYY-DD-MM
  • 日/月/年
  • 月/日/年
  • DD-MM-YY
  • 月-日-年
  • 年月日
  • 年月日
  • 年月日
  • YYDDMM
  • 年/月/日
  • 年/日/月
  • 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)))$

思考过程是有四种可能的组合,忽略分隔符和一年的位数。这些是:

DMY

MDY

YMD

YDM

所以这可以分为两组 - 开始的年份或结束的年份:

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

我还向分隔符添加了一个命名捕获组,以确保至少存在两个相同的字符(如果存在)。

于 2013-07-30T13:29:31.477 回答