2011-07-23 65 views
2
s="12/15" 
r=/((0?[1-9])|(1[0-2])){1}\/((0?[1-9])|(1[0-9])|(2[0-9])|(3[0-1])){1}/g 
s.match(r) 

> ["12/1"] 

我试图验证日期格式mm/dd 但匹配的字符串错过了最后一位数字。javascript正则表达式验证mm/dd

任何人都可以帮忙吗? 谢谢, 程

+0

@mu太短,我们可以排除'06/31'。看到我的答案。 –

回答

4

使用这个表达式:^(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])$

如果你想在字符串匹配,使用单词边界,如:

\b(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])\b 

(?x) 
^ 
(
    0?[1-9] # 1-9 or 01-09 
    | 
    1[0-2] # 10 11 12 
) 
/
(
    0?[1-9] # 1-9 or 01-09 
    | 
    [12][0-9] # 10-29 
    | 
    3[01]  # 30 31 
) 
$ 

大正则表达式:

(?x) 
\b(?: 
(?<month> 
    0?[13578] 
    | 
    1[02] 
) 
/
(?<day> 
    0?[1-9] 
    | 
    [12][0-9] 
    | 
    3[01] 
) 
| 
(?<month> 
    0?[469] 
    | 
    11 
) 
/
(?<day> 
    0?[1-9] 
    | 
    [12][0-9] 
    | 
    30 
) 
| 
(?<month> 
    0?2 
) 
/
(?<day> 
    0?[1-9] 
    | 
    [12][0-9] 
) 
) 
\b 
+0

谢谢,它的工作原理。 – cheng

+0

但你能告诉我什么是我的错? – cheng

+0

@cheng,忘记字符串的开头和结尾,即'^'和'$'。 –

1

起初我删除了一些括号。

一种可能解决您的问题是使用锚

^(0?[1-9]|1[0-2]){1}\/(0?[1-9]|1[0-9]|2[0-9]|3[0-1]){1}$ 

这将是解决办法,如果你的字符串是唯一的日期。那些锚点^$确保表达式从开始到结束匹配。

看到它here online on Regexr

第二种可能性是改变你的最后部分的顺序。

(0?[1-9]|1[0-2]){1}\/(1[0-9]|2[0-9]|3[0-1]|0?[1-9]){1} 

由于第一部分0?[1-9]符合您15你的表达成功,就是这样。如果我们把这个结尾,那么它首先尝试匹配两个数字组成的数字,然后匹配15