【问题标题】:RegEx to validate Date Format Masks正则表达式验证日期格式掩码
【发布时间】:2013-07-30 11:06:48
【问题描述】:

我正在寻找编写 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
  • 月/日/年
  • DD-MM-YY
  • MM-DD-YY
  • DDMMYY
  • MMDDYY
  • YYMMDD
  • YYDDMM
  • 年/月/日
  • 年/日/月
  • YY-MM-DD
  • YY-DD-MM

但不幸的是,还匹配以下内容:

  • DDMMDD
  • YYMMYYYY
  • MMMMMM

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

【问题讨论】:

    标签: regex vba excel


    【解决方案1】:

    您可以使用负反向引用来确保您不会重复任何以前的条目:

    ^(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}。

    【讨论】:

      【解决方案2】:

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

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

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

      D MY

      年月日

      年月日

      Y D M

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        相关资源
        最近更新 更多