接着上篇,这篇我们以一个手机号码的匹配进化历程来学习正则的相关知识点。记住了,我们要匹配一个手机号(用正则表达式),整篇就是干这个事。目的是学习正表达式的使用。
假设我们需要匹配的手机号为:18857012018
一、字符直接量:匹配自身
/18857012018/.test(“ 18857012018”);
// false
/18857012018/.test(“ 18857012018”);
// true
/18857012018/.test(“ui18857012018dd”);
// true
正则表达式在匹配时,只要输出匹配内容就返回true,不考虑前面的ui和后面的dd。最后这种情况显然不是我们想要的。
如何精准匹配了,接着往下看。
二、锚点:指定匹配位置
1、^匹配起始位置
/^http:/.test(“http://www.163.com”);
// true
/^http:/.test(“ahttp://www.163.com”);
//false
/^http:/.test(“https://www.163.com”);
//false
2、$匹配结尾位置
/.jpg$/.test(“1.jpg”); //true
/.jpg$/.test(“1.jpg png”); //false
/.jpg$/.test(“1.png”); //false
/.jpg$/.test(“regexp.png”); //false
3、b匹配一个单词边界
正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置。这里所谓的边界就是匹配位置。
/bisb/.test(“this”); //false
/bisb/.test(“that is reg”); //true
/bisb/.test(“thatisreg”); //false
/B[Ss]cript/; // 匹配非边界
最后一个正则表达式/B[Ss]cript/能够与”JavaScript”和”/postscript”匹配,但不与”script”与”Script”匹配,因为B表示非边界匹配。
讲清楚上面三点之后,现在我们来对一开始提到的那个电话号码的例子进行进一步的改造。改造之后是这样的:
/^18857012018$/.test(“18857012018”); //true
/^18857012018$/.test(“ui18857012018dd”);//false
/^18857012018$/.test(“13712345674″);//false
这样看,是不是解决了号码前后有字符不匹配的情况,但是细心的同学会发现, 这个正则只能识别这个标准的手机号码,能不能用一种电话号码格式识别所有的电话号码了?如果能,那这个表达式不就更通用了嘛。
回答是有的,不急,继续往下看
三、字符类:匹配一类字符中的一个
- [abc]:匹配a或b或c。
- [0-9]:匹配0到9之间的一个数字(只要字符串中有一个数字就为true,定义是匹配字符串中是否有数字)。
- [^0-9]:匹配非数字一个字符。
- [a-z]:匹配有一个字母(只要字符串有一个字母就为true,定义是匹配字符串中是否有字符)。
- .:匹配任一字符(换行符除外)。
语法应用举例,比如:
/[0-9]/.test(“123”) //true
/[0-9]/.test(“asd”) //false
/[^0-9]/.test(“asd”) //true
/[a-z]/.test(“asd”) //true
/./.test(“allen”) //true
/./.test(“12″) //true
/[a-z]/.test(’12a3′) // true
/[a-z]/.test(‘123’) // false
有了这些为基础,上面的实例我们就可以进一步改进,电话号码中除了第一位是1,其它每一位都是一个0到9之间的任意数字。所以我们可以这样改进:
/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test(“13762571094”);//true
/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test(“13712345678″);//true
此刻是不是感觉又好了一点,不过,这显然太长了呢,继续往下看。
关于元字符的概念这里就不详细了,这里列举一些元字符,来看看它们在与正则中都表示什么特殊意义。
- ^:开头、$:结尾、b:边界。
- d:[0-9]。D:[^d]
- s:空白符。S:[^s]
- w:[A-Za-z0-9_]。W:[^w]
语法应用举例,比如:
/d/.test(“123″); //true
/d/.test(“1dsf”); //true 只要有一个数字就是tru
/D/.test(“1dsf”); //true
/D/.test(“123″); //false
好了,接着我们在一开始匹配电话号码进行改进:
/^1dddddddddd$/.test(“13762571094”);//true
/^1dddddddddd$/.test(“13712345678”);//true
/^1dddddddddd$/.test(“1376257109x”);//false
是不是感觉代码比刚刚短了很多了呢?但这还是不够。接着往下看
四、量词:出现的次数
- {n,m}:n到m次。
- ?:{0,1}
- +:{1,}
- *:{0,}
语法应用举例:
/d*/.test(“abc”);// true
/d+/.test(“abc”);// false
/d+/.test(“1abc”);// true
接着将上面的匹配电话号码的实例进一步改进:
/^1d{10}$/.test(“13762571094”);//true
/^1d{10}$/.test(“13712345678”);//true
/^1d{10}$/.test(“1376257109x”);//false
写在最后的结束语:
整篇文章分了四个部分来讲,每次都用举例的方式讲清楚一个语法之后就接着对贯串全文的匹配电话号码的例子进行改造,有节奏的将正则匹配的常用语法,讲了一遍,希望对大家带来益处。如有本文有讲的不对的对方,欢迎留言。