5

我曾多次尝试为 asp.net 内部网表单 web 表单编写正则表达式字段验证器。我试图对我的进行调整,但没有成功。我正在使用并尝试编辑的当前是

((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4} 

我需要能够允许。

x1245
508-555-1212
5085551212
508 555 1212
508-555-1212 x1234
5085551212 x1243
508 555 1212 x1234

我所涵盖的唯一一个是列表中的第二个是第二个。

4

3 回答 3

6

这会做到的。

(\d\d\d-?\s?\d\d\d-?\s?\d\d\d\d\s?)?(x\d\d\d\d)?

或更短的等价物:

(\d{3}-?\s?\d{3}-?\s?\d{4}\s?)?(x\d{4})?

您想要匹配完整的电话号码,可选地使用空格/破折号,并使整个事情成为可选的,然后包括扩展名,并使其成为可选的。

于 2013-10-15T16:32:03.327 回答
4

像这样的模式将匹配您的所有输入:

\d{3}[- ]?\d{3}[- ]?\d{4}( x\d{4})?|x\d{4}

这将匹配:

  • 三位数
  • 可选空格或连字符
  • 三位数
  • 可选空格或连字符
  • 四位数
  • 可选组:

    • 一个空格和一个字面量x
    • 四位数

    -或者-

  • 一个空格和一个字面量x
  • 四位数

根据您的精确需求,您可能需要开始 ( ^) 和结束 ( $) 锚点来禁止模式周围的额外字符(例如"foo x1234 bar"):

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

更新

如果您想确保三个电话号码段之间的数字两个分隔符必须相同(例如508-555 1212不允许),最简单的方法是这样的:

\d{3}([- ]?)\d{3}\1\d{4}( x\d{4})?|x\d{4}

创建一个捕获组,(...)因为它恰好是模式中的第一个,所以它被称为组 1。\1是一个反向引用,它只会匹配组 1 中匹配的确切字符串。

于 2013-10-15T16:34:05.747 回答
2

这个相当复杂,但会匹配

var regex = new Regex(@"^(?<number>\d{3}(?<separator>([\s-]|))\d{3}\k<separator>\d{4})?" +
                       "((?<=\d)\s|(?<=^)|(?=$))" +
                       "(?<extension>x\d{4})?(?<=.)$");
  • ^字符串的开头
  • (?<number>开始命名组号
  • \d{3}匹配 3 位数字
  • (?<separator>开始命名组分隔符
  • ([\s-]|)匹配空间,-或空字符串
  • )关闭组分隔符
  • \d{3}匹配 3 位数字
  • \k<separator>匹配前一个分隔符
  • \d{4}匹配 4 位数字
  • )关闭组号
  • ?上一场比赛是可选的
  • ((?<=d)\s|(<=^)|(?=$))前一个字符是一个数字和匹配空格,或者如果在字符串的开头或结尾,则匹配零长度
  • (?<extension>)启动命名组扩展
  • x\d{4}匹配x后跟 4 位数字。
  • )关闭组扩展
  • ?扩展组是可选的
  • (?<=.)确保字符串不为空的零长度匹配
  • $匹配字符串结尾
于 2013-10-15T16:44:47.910 回答