FCC 高级算法题之验证美国电话号码(Validate US Telephone Numbers)

题目描述

虽然这个题目是高级算法题,实际上是正则表达式的内容,先把正则表达式写出来。观察例子可以得出几个结论:

  • 电话号码为十位数字(不包括国家码,连接符)
  • 国家码可以有也可以没有,有的时候只能为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
2
3
4
function telephoneCheck(str) {
return /^1?\s?(\(\d{3}\)|\d{3})(\s|-)?\d{3}(\s|-)?\d{4}$/.test(str);
}
telephoneCheck("555-555-5555");