RegEx验证日期格式掩码

时间:2013-07-30 11:06:48

标签: regex vba excel-vba excel

我正在寻找RegEx来验证用户输入的日期格式,例如“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
  • 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
  • DD-MM-YY
  • MM-DD-YY
  • DDMMYY
  • MMDDYY
  • YYMMDD
  • YYDDMM
  • YY / MM / DD
  • YY / DD / MM
  • YY-MM-DD
  • YY-DD-MM

但遗憾的是,还符合以下条件:

  • DDMMDD
  • YYMMYYYY
  • MMMMMM

有没有办法只匹配第一个列表中指定的格式? RegEx将用于VBA表单验证。

2 个答案:

答案 0 :(得分: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}。

答案 1 :(得分:0)

未针对VBA进行测试,但具体如何:

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

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

D M Y

M D Y

Y M D

Y D M

所以这可以分成两组 - 年初或年末:

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

我还将一个命名的捕获组添加到分隔符中,以确保存在至少两个相同的字符。