题目

如果传入字符串是一个有效的美国电话号码,则返回 true.

用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下面测试时用到的一些变体写法):

555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
5555555555
1 555 555 5555

在本节中你会看见如 800-692-7753 or 8oo-six427676;laskdjf这样的字符串. 你的任务就是验证前面给出的字符串是否是有效的美国电话号码. 区号是必须有的. 如果字符串中给出了国家代码, 你必须验证其是 1. 如果号码有效就返回 true ; 否则返回 false.

提示

RegExp

测试用例

  • telephoneCheck("555-555-5555") 应该返回一个布尔值.
  • telephoneCheck("1 555-555-5555") 应该返回 true.
  • telephoneCheck("1 (555) 555-5555") 应该返回 true.
  • telephoneCheck("5555555555") 应该返回 true.
  • telephoneCheck("555-555-5555") 应该返回 true.
  • telephoneCheck("(555)555-5555") 应该返回 true.
  • telephoneCheck("1(555)555-5555") 应该返回 true.
  • telephoneCheck("1 555)555-5555") 应该返回 false.
  • telephoneCheck("1 555 555 5555") 应该返回 true.
  • telephoneCheck("1 456 789 4444") 应该返回 true.
  • telephoneCheck("123**&!!asdf#") 应该返回 false.
  • telephoneCheck("55555555") 应该返回 false.
  • telephoneCheck("(6505552368)") 应该返回 false
  • telephoneCheck("2 (757) 622-7382") 应该返回 false.
  • telephoneCheck("0 (757) 622-7382") 应该返回 false.
  • telephoneCheck("-1 (757) 622-7382") 应该返回 false
  • telephoneCheck("2 757 622-7382") 应该返回 false.
  • telephoneCheck("10 (757) 622-7382") 应该返回 false.
  • telephoneCheck("27576227382") 应该返回 false.
  • telephoneCheck("(275)76227382") 应该返回 false.
  • telephoneCheck("2(757)6227382") 应该返回 false.
  • telephoneCheck("2(757)622-7382") 应该返回 false.
  • telephoneCheck("555)-555-5555") 应该返回 false.
  • telephoneCheck("(555-555-5555") 应该返回 false.

分析思路

  1. 分析该题,主要是分析电话号码的有效排列方式,有效的号码规则如下:
  • 分离 国家码-区号-电话号,格式如 1-555-555-5555,其中每个分段中间是不能被分割的,如1-55-5-555-5555是非法的;
  • 在不能分段的每个区域中和两头,空格是可以随意加的(任意个),如: 1 555 555 5555155555555555是合法的;
  • 在不能分段的每个区域中,中划线是可以加一个的,如:1-555-555-5555 1 - 555-555 - 55551 - 555-5555555是合法的,1-555--555-5555是非法的;
  • 在区号上可以加小括号,而且必须配对,括号中间允许出现空格在数字两边,如:1(555)555 55551( 555 )5555555是合法的,1 555) 555 5555是非法的;
  • 除了以上分隔符和数字,其他任意符号都是非法的,如:1a(555)555 55551(555) 555 5555$都是非法的;
  • 数字必须限制在 10 个(无国家码)/11个,如:1 555 5555 5555是非法的;
  • 国家码可以不存在,存在则必须为1,如:(555) 555 55551 555 555 5555是合法的,而2 555 555 5555是非法的;
  1. 正则表达式编写
  • 数字分段匹配,[\d]{3}这样就是匹配连续三个数字,通过该方式,可以匹配数字分段和数字数目;
  • ? 匹配符,匹配一个或0个前面的符号,如:[-]?,匹配一个或0个中划线;
  • * 匹配符,匹配0个或多个前面的符号,如:[\s]*,匹配0个或多个空格;
  • ^$ 两个符号分别表示字符串首匹配和字符串尾匹配,两个均加入表示从串首匹配到串尾,如:^[\d]{3}[-][\d]{3}-[\d]{4}$这个正则式,555-555-5555是匹配的,但a55-555-5555555-555-55555等都是不匹配的;

    综上,所以得到的正则匹配表达式如代码说明

代码

function telephoneCheck(str) {
// Good luck!
var regStr = /^[\s]*[\d]?[\s]*[-]?[\s]*[(]?[\s]*[\d]{3}[\s]*[)]?[\s]*[-]?[\s]*[\d]{3}[\s]*[-]?[\s]*[\d]{4}[\s]*$/; if (regStr.test(str)) { // 匹配数目和号码串格式
if ((/[(]/.test(str) && /[)]/.test(str)) || // 如果有(),检查括号的配对
(!(/[(]/.test(str)) && !(/[)]/.test(str)))) { // 无(),就不能存在任意括号符号
if (str.replace(/[\s-()]*/g, "").length > 10) { // 长度判断,判断国家是否存在,若存在是否正确
return (str[0] === "1");
}
return true;
}
} return false;
} telephoneCheck("555-555-5555");

[Advanced Algorithm] - Validate US Telephone Numbers的更多相关文章

  1. FCC高级编程篇之Validate US Telephone Numbers

    Validate US Telephone Numbers Return true if the passed string is a valid US phone number. The user ...

  2. Validate US Telephone Numbers

    function telephoneCheck(str) { // Good luck! //return true; var phone = /^1? ?(\d{3}|\(\d{3}\))[ -]? ...

  3. FCC(ES6写法) Validate US Telephone Numbers

    如果传入字符串是一个有效的美国电话号码,则返回 true. 思路:用正则,参考网上资料和js高级程序设计(5.4RegExp类型). let telephoneCheck = str => /^ ...

  4. Validate US Telephone Numbers FreeCodeCamp

    function telephoneCheck(str) { // 祝你好运 //var re = /^1? ?(\(\d{3}\)|\d{3})[ |-]?\d{3}[ |-]?\d{4}$/; / ...

  5. PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)

    Two integers are called "friend numbers" if they share the same sum of their digits, and t ...

  6. PAT Advanced 1023 Have Fun with Numbers (20) [⼤整数运算]

    题目 Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维

    题意:博弈题面  给出一个数字序列 (>=11)  有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手  数字序列一定是奇 ...

  8. 高级算法设计讲义 Lecture Notes for Advanced Algorithm Design

    (Last modification: 2012-12-17) Textbooks: (1) David Williamson, David Shmoys. The Design of Approxi ...

  9. [Advanced Algorithm] - Inventory Update

    题目 依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物 ...

随机推荐

  1. [转] C# 隐藏方法和重写方法

    1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写 (override),这样基类中的方法在子类中已经被重写了,基类中的方法在子类中已经失去了功能 了.当让基类 ...

  2. 清北学堂模拟赛d4t4 a

    分析:感觉和dp的状态转移方式有点类似,对于一个数,你不能看有多少个状态能转移到它,你要看它能转移到多少个状态,相当于刷表法和填表法的区别,对于这道题也是一样,我们不能看有多少个数是x的倍数,而是每次 ...

  3. 单词接龙(codevs 1018)

    2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经 ...

  4. js es6 Object.freeze

    将对象冻结,使用Object.freeze方法 const foo = Object.freeze({}); // 常规模式时,下面一行不起作用: // 严格模式时,该行会报错 foo.prop = ...

  5. 造成segment fault,产生core dump的可能原因

    1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, spr ...

  6. MFC 小知识总结四

    1 PlaySound  播放WAV格式的音乐 This function plays a sound specified by a file name, resource, or system ev ...

  7. Apache + Tomcat + JK 集群

    原文请见http://www.cnblogs.com/dennisit/p/3370220.html 本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面相应的应 ...

  8. hibernate4中oracle,sqlserver,mysql数据库的sql方言配置(SQL Dialects)

    hibernate4中oracle,mysql,sqlserver数据库的sql方言配置(SQL Dialects) 数据库类型 Hibernate sql方言 DB2 org.hibernate.d ...

  9. C++中的inline的用法

    C++中的inline的用法  参考:http://www.cnblogs.com/fnlingnzb-learner/p/6423917.html 1. 引入inline关键字的原因 在c/c++中 ...

  10. 687C

    dp 以前做过 忘了. 想破脑袋不知道怎么设状态 dp[i][j][k]表示选到第i个硬币,当前和为j,能否弄出k dp[i][j][k]|=dp[i-1][j][k]|dp[i-1][j][k-c[ ...