这次Regex如何工作?

时间:2010-09-18 08:58:13

标签: javascript regex

我刚刚继承了很多客户端验证的预测。

在这里我发现了一个正则表达式检查器,正如预期的那样没有评论。我承认正则表达式绝对是我失败的一点。 (在Javascript中!)

var myRegxp = /(([0]*[1-9]{1})|([1]{1}[0-2]{1}))(\/{1})((19[0-9]{2})|([2-9]{1}[0-9]{3}))$/;
if (!myRegxp.test(args.Value))
{//do fail stuff here};

我非常确定页面的其余部分应该检查某种日期格式。这会通过MM / YYYY。从一些早期的测试中,几乎就可以了。

如果此正则表达式与MM / YYYY不匹配,那么最好的方法是什么?

任何来自正则表达大师的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

以MM / YYYY结尾(MM为1-12,YYYY为1900-9999)

(匹配月份)

([0]*[1-9]{1})
zero or more occurences of '0', and one occurence of 1-9
Example match: 01

OR

([1]{1}[0-2]{1})
1 match of '1', 1 match of 0-2
Example match: 10

第二部分(年),首先它与'/'字面匹配:

(\/{1})

那一年:

((19[0-9]{2})
One match of '/', 19 and two matches of 0-9 (looks like a year in the range 1900-1999)
Example match: 1900

OR

([2-9]{1}[0-9]{3})
1 match of 2-9 and thee matches of 0-9 (looks like a year in the range 2000-9999
Example match: 2000

简化的RE:

var myRegExp = /^(0[1-9]|1[0-2])\/(19\d{2}|[2-9]\d{3})$/;

注意:\d0-9的字符类。我删除了用于分组的括号,因为myRegExp.test中没有使用这些括号。 替换[0]* 0?,因为它不应与0000001/2010匹配,但它应与1/2010匹配。[0]*替换为0因为它应该字面上匹配01而不是1^$是锚点,导致它从头到尾匹配。当它们离开时,这个RE将匹配任何包含MM / YYYY的文本。

答案 1 :(得分:1)

我同意 - 它是以 MM / yyyy 格式检查日期。

它允许月内任意数量的前导零。它允许年份匹配19 xx或以29之间的数字开头的任何其他内容。这意味着它允许一年中最多9999的任何东西:)