JavaScript如何修复电话号码正则括号不成对匹配的问题
JavaScript 成对括号校验电话号码正则解决方案
最终修正正则
const phoneReg = /^1?[-\s]?(?:\(\d{3}\)|\d{3})[-\s]?(?:\(\d{3}\)|\d{3})[-\s]?\d{4}$/
修正逻辑说明
原来的正则漏洞出现在\(?\d{3}\)?的写法上:左括号和右括号各自独立可选,会出现单括号的非法情况。修正方案是用分支非捕获组强制括号要么同时出现,要么都不出现:
- 用
(?:\(\d{3}\)|\d{3})替代原来的\(?\d{3}\)?,该分组仅匹配两种合法格式:带成对括号的3位数字(xxx),或不带括号的3位数字xxx,完全排除单括号场景 - 同时将开头1之后的
\s?调整为[-\s]?,兼容合法示例中1-555-xxxxxxx的短横线分隔场景
正则各段含义
^匹配字符串开头,避免前缀多余字符1?匹配可选的开头字符1[-\s]?匹配可选分隔符,支持短横线、空格、无分隔三种情况(?:\(\d{3}\)|\d{3})非捕获组,强制3位数字的括号成对\d{4}匹配末尾固定4位数字$匹配字符串结尾,避免后缀多余字符
测试效果
- 所有列出的合法号码均可正常匹配
1 (555-555-5555、555) 555 5555这类单括号非法号码会匹配失败
内容的提问来源于stack exchange,提问作者khan ubaid
相关产品推荐
相关产品推荐

