日期和时间的正则表达式

时间:2011-05-05 12:22:52

标签: regex

任何人都可以帮助为这个逻辑组成正则表达式吗?

MM/DD/YYYY hh:mm AM/PM 
MM/DD/YYYY hh AM/PM 
MM/DD/YYYY 
MM/YYYY 
YYYY 

[日期模板]

M/D/YY 
M/YY 
M/YYYY 
M/D/YYYY 

MMM YY 
MMM YYYY 
MMMM YY 
MMMM YYYY 

YY/M 
YY-M 
YY.M 

YYYY/M 
YYYY-M 
YYYY.M 

YYYY 

YYYY/M/D 
YYYY-M-D 
YYYY.M.D 

M-D-YY 
M-YY 
M-YYYY 
M-D-YYYY 

M.D.YY 
M.YY 
M.YYYY 
M.D.YYYY 

MMM D[,] YY 
MMM D[,] YYYY 

MMMM D[,] YY 
MMMM D[,] YYYY 

D MMM[,] YY 
D MMM[,] YYYY 

D MMMM[,] YY 
D MMMM[,] YYYY 

[时间模板]

hh:mm AM (or PM or A or P) 
hh AM (or PM or A or P) 
HH:mm 

YY two-digit year (00 => 2000, 10 => 2010) 

1 个答案:

答案 0 :(得分:3)

给你一些提示: 您可以通过不同的方式指定月份:M,MM,MMMM

M表示它是一个数字,所以你可以像[0-9]一样编写它(有更紧凑的方法,但我认为这需要的解释最少)。

MM表示你可以有另一个数字,但这个数字显然只有1,因为12是最高数字。

所以我们改变了表达式:1?[0-9]。这意味着一个是可选的。

这是对的吗?不,因为它会例如接受0作为有效月份。所以再改变它。

(1[0-2]|[1-9])表示:1后跟0到2之间的另一个数字,因此接受10,11,12。大括号是为了创建一个小组。

现在接受MMMM

(1[0-2]|[1-9]|January|February)等。

这可以进一步组成,例如MM/YYYYYYYY

((1[0-2]|[1-9]|January|February)/)?<YYYY-Pattern>

也不要忘记匹配开头和开头:

^((1[0-2]|[1-9]|January|February)/)?<YYYY-Pattern>$

否则你会匹配abc MM/DD/YYYY bla

之类的内容

如果一切正常,您应该使用非捕获组,而不需要引用组的内容。因此^((1[0-2]|[1-9]|January|February)/)?<YYYY-Pattern>$变为^(?:(1[0-2]|[1-9]|January|February)/)?<YYYY-Pattern>$,因为您可能不需要使用/引用该组。 (但我认为这取决于实现)。要引用groupse,您可能想要给它们命名。看看这里:http://www.regular-expressions.info/named.html

那就是我编写正则表达式的方式......

不要放弃,这将是一个更长的表达,但不是一个非常复杂的表达。