带国家码的手机号正则验证问题求助
带国家码的手机号正则验证解决方案
问题核心规则
需要验证的手机号需满足:
- 必须以
+或-开头 - 包含8-16位数字,可在任意位置插入连字符
- - 不能包含空格
- 支持多个号码用逗号
,分隔
原有正则的问题
第一个正则
/^[+-][1-9]{0,1}[0-9-]{0,16}[,]$/- 强制要求结尾必须有逗号,单个合法号码无法匹配
- 未严格控制数字总位数(仅限制字符长度,未区分数字和连字符)
- 不支持多号码的正确分隔逻辑
第二个正则
^[+-][0-9-]{0,16}+(,[+-][0-9-]{0,16}+)*$- 语法错误:
{0,16}+属于重复量词叠加,正则引擎无法解析 - 未区分数字和连字符,无法保证数字总位数在8-16之间
- 未限制空格,会匹配包含空格的无效号码
- 语法错误:
正确的正则表达式
^[+-](?=(?:.*\d){8,16})[-\d]+(?:,[+-](?=(?:.*\d){8,16})[-\d]+)*$
正则拆解说明
^[+-]:匹配号码开头的+或-(?=(?:.*\d){8,16}):正向预查,确保当前号码段内包含8-16个数字(忽略连字符的干扰)[-\d]+:匹配后续的数字和连字符,确保无空格等非法字符(?:,[+-](?=(?:.*\d){8,16})[-\d]+)*:匹配用逗号分隔的多个合法号码段,(?:...)为非捕获组,避免不必要的内存占用
验证效果
- 有效号码全部匹配:
+18790912345、+18790112345,+18790123409、+1-2569890912345等 - 无效号码全部排除:
+1909890(数字不足8位)、9800112345(无开头符号)、+1 9092345690(包含空格)
内容的提问来源于stack exchange,提问作者Boopathi Vkl
相关产品推荐
相关产品推荐

