2011-08-09 36 views
1

我是Asp.Net的新手,我想用regularexpressionvalidator驗證SSN。在regularexpressionvalidator我給regularexpression爲:如何爲正則表達式指定可選字符?

ValidationExpression="\d{3}-\d{2}-\d{4}" 

我的正則表達式工作正常。它說3位然後 - 然後2位數 - 然後4位數。

不過,我也想正則表達式成功時,文本框是滿空或文本框只包含:

_ - _-_ _ _ _

其中_代表「空間「(不是_,我已經展示過_只是編輯可以在SO上展示它)。

我該怎麼做regularexpressionvalidator?

回答

4

這種模式應滿足三個用例:

^([ ]{3}-[ ]{2}-[ ]{4}|\d{3}-\d{2}-\d{4})$ 

我用文字空格字符數組以上而不是\s,因爲\s也會匹配製表符,換行符和其他空白字符。此外,保持空格和數字測試是分開的,而不是在相同的子模式中,否則就會匹配垃圾輸入,如123-__-6_8_

編輯:@Dan在他的回答中正確指出^和$應該圍繞整個模式,所以我們匹配整個字符串,而不僅僅是在其中找到一個SSN。

+0

順便說一句,你沒有*有*方括號周圍的空間,我只是發現把字符數組中的空間,使他們更加明顯。 – richardtallent

+0

好的!感謝您的解釋。 – TCM

2

管道字符|指定了替代模式。模式\s{3}-\s{2}-\s{4}與空格匹配,您的模式\d{3}-\d{2}-\d{4}與SSN匹配,空白模式匹配空輸入。因此,模式^(\s{3}-\s{2}-\s{4}|\d{3}-\d{2}-\d{4}|)$應該匹配這三個中的任何一個。

+0

空間和'\ s'是不一樣的東西(後者匹配也TAB) – 6502

1

只需測試您的兩個特殊值即可。像(僞代碼):

if ((input == "") || (input = " - - ")) { 
    // valid but "empty" 
} else if (input matches your regex) { 
    // valid, non-empty input 
} 

如果你不能做到這一點,只需使用|替代你的RE:

ValidationExpression="^(\d{3}-\d{2}-\d{4}| - - |)$" 

錨是重要的(除非你的框架隱將它們相加) ,否則空匹配不起作用,並且你會在你想要的格式之前或之後(或兩者)匹配「垃圾」。 (檢查空間在第二塊,不只是複製/粘貼:-))

+1

我在asp.net中使用regularexpressionvalidator。它具有名爲RegularExpression的屬性。這只是一個財產。我不認爲我可以在那裏寫這個長碼。 – TCM

+0

對不起,我對此不太瞭解。用單個RE更新。 – Mat

1
"^((\d{3}-\d{2}-\d{4})|(_ _ - _-_ _ _ _))$" 

接受輸入只:
位數 「3位,2位,4位」 這樣的:123-45-6789
空:_ _ - _-_ _ _ _

+1

不幸的是,這將匹配'123 -__- 6789',而不僅僅是空格或唯一的數字,並且也不會匹配空字符串。 – richardtallent

+0

@richardtallent:你是對的,修好了。 –