如何为正则表达式指定可选字符?

时间:2011-08-09 05:23:30

标签: c# asp.net regex

我是Asp.Net的新手,我想使用regularexpressionvalidator验证SSN。在regularexpressionvalidator中,我将regularrexpression表示为:

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

我的正则表达式正常。它表示3位数字 - 然后是2位数字 - 然后是4位数字。

但是,当文本框为空或文本框仅包含时,我还希望正则表达式成功:

_ _ - _-_ _ _ _

其中_代表“空格”(不是_。我已经显示_只是因此编辑可以在SO上显示它。)

我怎样才能使用regularexpressionvalidator?

5 个答案:

答案 0 :(得分:4)

此模式应满足所有三种用例:

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

我在上面的字符数组中使用了文字空格而不是\s,因为\s也会匹配制表符,换行符和其他空白字符。此外,重要的是保持空格和数字测试分开,而不是在同一子模式中,否则您将匹配像123-__-6_8_这样的垃圾输入。

编辑:@Dan在他的回答中正确地指出^和$应该围绕整个模式,所以我们匹配整个字符串,而不只是在其中找到SSN。

答案 1 :(得分: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}|)$应与这三种模式中的任何一种匹配。

答案 2 :(得分:1)

我只是用谷歌搜索'SSN正则表达式':

http://regexlib.com/REDetails.aspx?regexp_id=535&AspxAutoDetectCookieSupport=1

^(?!000)([0-6]\d{2}|7([0-6]\d|7[012]))([ -]?)(?!00)\d\d\3(?!0000)\d{4}$

这有帮助吗?

编辑:刚刚看到你想要空间也可以工作。也许您可以通过在字符范围中包含“空格”来修改上述内容吗?

答案 3 :(得分: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}|   -  -    |)$"

锚点很重要(除非您的框架隐式添加它们),否则空匹配将无效,您将在所需格式之前或之后(或两者)匹配“垃圾”。 (检查第二个块中的空格,不要只复制/粘贴它:-))

答案 4 :(得分:1)

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

仅接受输入:
数字“3位,2位,4位”如:123-45-6789
空:_ _ - _-_ _ _ _