我正在寻找RegEx来验证用户输入的日期格式,例如“DD / MM / YYYY”(不是日期验证)
我是RegEx的新手,但到目前为止,我有以下内容:
(D{2}|M{2}|Y{2,4})[-|/]?(D{2}|M{2})[-|/]?(D{2}|M{2}|Y{2,4})
这符合以下日期格式:
但遗憾的是,还符合以下条件:
有没有办法只匹配第一个列表中指定的格式? RegEx将用于VBA表单验证。
答案 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)))
$
我还将一个命名的捕获组添加到分隔符中,以确保存在至少两个相同的字符。