2011-01-19 69 views
1

這應該是簡單的有經驗的正則表達式的作家,但我不把它們寫很多,所以....需要一個正則表達式逗號分隔的號碼列表

我想要做一個文本框輸入驗證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個匹配,我不確定這意味着什麼。由於它在上述Failing案例上失敗,我認爲對於簡單的輸入驗證是安全的。有更好的模式嗎?

不太重要的問題:爲什麼當範圍爲0-99時允許444?

+0

它允許444,因爲你使```可選。所以它可以首先匹配44,然後是4. – 2011-01-19 19:49:15

+0

其實我認爲它匹配的是'4',然後是'4',然後是'4'。它沒有看到「99」爲「九十九」,它將其視爲「9」或「9」。 – Beta 2011-01-19 20:00:53

+0

@Beta它將其視爲「0-9」或「9」,這是多餘的(與只說`[0-9]`相同)。 – 2011-01-19 20:11:49

回答

5

範圍運算符只能指定ASCII字符的範圍,而不是數字。試試這個:

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

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"; 
}; 
3

你的正則表達式是錯誤的:它說:「從字符串匹配一個或多個組,使得該組由數字0到9(其他9是多餘的)的開始,也許後面的逗號最多到最後」。

這顯然不是你想要的。你需要這個:

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

它匹配:「從字符串相匹配的一個或多個數字,後面可以跟由逗號的羣體開始跟着一個或多個數字,最多的結束串」。這些小組沒有捕獲一個,所以最多隻能有一個匹配。

相關問題