用于验证日期格式掩码的正则表达式

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
  • 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
是否有办法只匹配第一个列表中指定的格式? 正则表达式将用于VBA表单验证。
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}。

0

虽然没有针对 VBA 进行测试,但这种方法如何:

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

思路是年份有四种可能的组合,忽略分隔符和数字数量。它们是:

日 月 年

月 日 年

年 月 日

年 日 月

因此,这可以分为两组 - 年份在开头或年份在结尾:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接