我曾多次尝试为 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
我所涵盖的唯一一个是列表中的第二个是第二个。
这会做到的。
(\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})?
您想要匹配完整的电话号码,可选地使用空格/破折号,并使整个事情成为可选的,然后包括扩展名,并使其成为可选的。
像这样的模式将匹配您的所有输入:
\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 中匹配的确切字符串。
这个相当复杂,但会匹配
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 位数字。)关闭组扩展?扩展组是可选的(?<=.)确保字符串不为空的零长度匹配$匹配字符串结尾