虽然这个题目是高级算法题,实际上是正则表达式的内容,先把正则表达式写出来。观察例子可以得出几个结论:
- 电话号码为十位数字(不包括国家码,连接符)
- 国家码可以有也可以没有,有的时候只能为1
- 没有国家码时,如果电话号码没有连着写,则以334的形式分隔(如果有国家码,则以1334分组)
- 不包括国家码的第一组数字,可以用括号包围。
- 分隔符为空格或连接符,两者不能接连出现
那么来逐一实现
第一步,实现十位数字连接出现和以334的形式出现
\d{3}\d{3}\d{4}
第二步,实现国家码以1出现和不出现
1?\d{3}\d{3}\d{4}
第三步,实现国家码之后可以有空格也可以无空格
1? ?\d{3}\d{3}\d{4}
注意不要用 /s
来匹配空格,因为/s
匹配的是一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格
第四步,实现电话号码之间可以不分隔也可以用空格或连接符分隔
1? ?\d{3}( |-)?\d{3}( |-)?\d{4}
第五步,实现第一组电话号码可以用括号包围,注意括号需要转义
1? ?(\(\d{3}\)|\d{3})( |-)?\d{3}( |-)?\d{4}
第六步,为了保证匹配的是一串完整的号码,而不是某段数字的中间,匹配匹配输入开始和输入结束
^1? ?(\(\d{3}\)|\d{3})( |-)?\d{3}( |-)?\d{4}$
正则表达式写完了,代码就很简单了
1 | function telephoneCheck(str) { |