需要一个逗号分隔数字列表的正则表达式

时间:2011-01-19 19:47:36

标签: regex asp.net-mvc-2 validation csv

对于有经验的正则表达式编写者来说这应该很简单,但我不会写太多,所以....

我想在C#MVC表单的文本框上进行输入验证,可能使用javascript或jquery。

我想将输入限制为以逗号分隔的整数列表。该列表必须以数字> = 0开头,后跟逗号,然后重复此模式。该列表可能以逗号结尾也可能不以逗号结尾:

1,2,444,5, - 通过

1,2,444,5 - 通过

,1,2,444,5, - 失败

,1,2,444,5 - 失败

1,2,444,5 - 失败

1,2,444,5 ,, - 失败

我写了这个:^([0-99],?)+$并在regexlib.com上进行了测试,它似乎有效,但测试人员返回2个匹配项,我不确定这意味着什么。由于它在上面的失败案例中失败了,我认为它对于简单的输入验证是安全的。有更好的模式吗?

不太重要的问题:当范围为0-99时,为什么它允许444?

3 个答案:

答案 0 :(得分:5)

范围运算符只用于指定ASCII字符的范围,而不是数字。试试这个:

^([0-9]+,?)+$

答案 1 :(得分:3)

你的正则表达式是错误的:它说“从字符串的开头,匹配一个或多个组,使得该组由数字0到9组成(其他9是冗余的),可能后跟逗号。直到结束”。

这显然不是你想要的。你需要这个:

^\d+(?:,\d+)*$

它匹配:“从一个或多个数字的字符串匹配开始,可选地后跟由逗号后跟一个或多个数字组成的组,直到字符串的结尾”。这些组是非捕获组,因此您最多只能有一个匹配。

答案 2 :(得分:0)

^(([0-9],?)+)$或^([0-9],?)+ $ /取决于重用

测试

my %a=qw(1,2,444,5,  Pass
1,2,444,5  Pass
,1,2,444,5, Fail
,1,2,444,5  Fail
1,,2,444,5  Fail
1,,2,444,5,, Fail
);

while(my ($k,$v)=each(%a)) {
    $vv = ($k =~ m/^(([0-9],?)+)$/) ? "Pass" : "Fail";
    print "$k $v $vv\n";
};