[Advanced Algorithm] - Validate US Telephone Numbers
题目
如果传入字符串是一个有效的美国电话号码,则返回 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.
提示
测试用例
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)")应该返回falsetelephoneCheck("2 (757) 622-7382")应该返回false.telephoneCheck("0 (757) 622-7382")应该返回false.telephoneCheck("-1 (757) 622-7382")应该返回falsetelephoneCheck("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-555-555-5555,其中每个分段中间是不能被分割的,如1-55-5-555-5555是非法的;- 在不能分段的每个区域中和两头,空格是可以随意加的(任意个),如:
1 555 555 5555、155555555555是合法的;- 在不能分段的每个区域中,中划线是可以加一个的,如:
1-555-555-5555、1 - 555-555 - 5555、1 - 555-5555555是合法的,1-555--555-5555是非法的;- 在区号上可以加小括号,而且必须配对,括号中间允许出现空格在数字两边,如:
1(555)555 5555、1( 555 )5555555是合法的,1 555) 555 5555是非法的;- 除了以上分隔符和数字,其他任意符号都是非法的,如:
1a(555)555 5555、1(555) 555 5555$都是非法的;- 数字必须限制在 10 个(无国家码)/11个,如:
1 555 5555 5555是非法的;- 国家码可以不存在,存在则必须为1,如:
(555) 555 5555、1 555 555 5555是合法的,而2 555 555 5555是非法的;
- 正则表达式编写
- 数字分段匹配,
[\d]{3}这样就是匹配连续三个数字,通过该方式,可以匹配数字分段和数字数目;?匹配符,匹配一个或0个前面的符号,如:[-]?,匹配一个或0个中划线;*匹配符,匹配0个或多个前面的符号,如:[\s]*,匹配0个或多个空格;^、$两个符号分别表示字符串首匹配和字符串尾匹配,两个均加入表示从串首匹配到串尾,如:^[\d]{3}[-][\d]{3}-[\d]{4}$这个正则式,555-555-5555是匹配的,但a55-555-5555、555-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的更多相关文章
- FCC高级编程篇之Validate US Telephone Numbers
Validate US Telephone Numbers Return true if the passed string is a valid US phone number. The user ...
- Validate US Telephone Numbers
function telephoneCheck(str) { // Good luck! //return true; var phone = /^1? ?(\d{3}|\(\d{3}\))[ -]? ...
- FCC(ES6写法) Validate US Telephone Numbers
如果传入字符串是一个有效的美国电话号码,则返回 true. 思路:用正则,参考网上资料和js高级程序设计(5.4RegExp类型). let telephoneCheck = str => /^ ...
- Validate US Telephone Numbers FreeCodeCamp
function telephoneCheck(str) { // 祝你好运 //var re = /^1? ?(\(\d{3}\)|\d{3})[ |-]?\d{3}[ |-]?\d{4}$/; / ...
- 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 ...
- 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, ...
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ...
- 高级算法设计讲义 Lecture Notes for Advanced Algorithm Design
(Last modification: 2012-12-17) Textbooks: (1) David Williamson, David Shmoys. The Design of Approxi ...
- [Advanced Algorithm] - Inventory Update
题目 依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物 ...
随机推荐
- 【[Offer收割]编程练习赛 14 A】小Hi和小Ho的礼物
[题目链接]:http://hihocoder.com/problemset/problem/1505 [题意] [题解] 考虑Meet in the middle. 因为两个数的和不是很大; 直接用 ...
- 对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释
SPI SPI(Serial Peripheral Interface:串行外设接口); SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可 ...
- [Python]Django部署问题
给客户部署系统 Apache + mod_wsgi + django 打开浏览器妈的死活就是pending状态 运来mod_wsgi用的32位,操作系统64位(window server 2003 r ...
- 使用butterknife注解project配置
使用butterknife注解的时候建议使用Jar包 Jar包下载地址:https://github.com/JakeWharton/butterknife Eclipseproject配置: 步骤一 ...
- ANDROID窗体管理服务实现机制和架构分析
一.功能 窗体管理是ANDROID框架一个重要部分,主要包含例如以下功能: )Z-ordered的维护 )窗体的创建.销毁 )窗体的绘制.布局 )Token管理,AppToken )活动窗体管理 ...
- vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法(转载)
vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法 笔者用的Linux发行版本为centos当用FTP客户端连接时,出现如下错误提示 ...
- C++_homework_EraseComment
顾名思义就是删除程序中的注释,不清楚fsm的机制,完全是自己的思路做. 开头先读取一个字符确定是否到文件结尾,如果读取成功,是换行的话就换行,并继续读取,不是的话,用putback放回缓冲区,并整行读 ...
- 520D
模拟 很明显应该尽量选最大或最小的数.那么我们维护一个set,再维护一个mp,每次检查是否能选,如果选完这个数上面的东西不悬空就可以选,每次选完都要更新四周-2+2的方块,因为再远就影响不到了 #in ...
- Genesis 多边形闭轮廓填充算法
通过逐行扫描,计算得出直线与多边形相交点进行求解 原理图形如下所示: 相关函数: /// <summary> /// 求点P到线段L距离 /// </summary> /// ...
- js form settimeout
<html><head><meta charset="utf8"><script type="text/javascript&q ...