之前学习正则的时候,学的比较懒散,基本就看一遍就过了,工作中遇到需要正则匹配的,基本靠百度。
像:手机号、座机号、邮箱、身份证号码的校验,百度上一搜全是答案。
最近工作很清闲,就把正则简单过一遍吧,我是劳碌命,闲下来会觉得浪费时间……
创建正则表达式的两种方式
比如:手机号码的校验
- var reg = /^d{11}/
- var reg = new RegExp(/^d{11}/)
上面的两种方式都是可以的
正则的使用方式
- 正则在前的exec匹配:——返回值是个对象Object
- 正则在前的test匹配:——返回值是true或false
- 字符串在前的match匹配:——返回值是个对象Object
- 字符串的replace替换:——返回的是替换后的结果
- 字符串的search检索:——返回的是索引值
- 字符串的split分割:——返回的是数组
匹配一个字符串——/xxxx/
匹配一个字符串’test’,如果匹配到则返回’test’,否则返回的是一个null
匹配连续字符——/x{n}/
匹配’ccainiao’中的连续的c
匹配区间内的连续字符——/x{n,m}/
匹配’ccccainiao’中3个c到5个c
由以上例子可以推断出,
匹配1个及以上的c:
简化写法: 表示0次或者多次,相当于{0,}
简化写法:表示1次或者多次,相当于{1,}
简化写法:表示0次或者1次,相当于{0,1}
正则表达式的贪心模式
人都是贪婪的,正则也是如此。我们在例子reg = /c{3,4}/;str=‘ccccTest’;的例子中已经看到了,能匹配四个的时候,正则绝对不会去匹配三个。
上面所介绍的所有的正则都是这样,只要在合法的情况下,它们会尽量多去匹配字符,这就叫做贪心(贪婪)模式。
如果我们希望正则尽量少地匹配字符,那么就可以在表示数字的符号后面加上一个?。组成如下的形式:
开头和结尾的匹配——^与$
**^**表示只匹配字符串的开头
**$**表示只匹配字符串结尾的字符
上面只匹配到第一个字符了,如果是要返回所有的字符,则需要有个
正则表达式中的或——|
b|c表示,匹配b或者c
结合上面提到的匹配字符,然后如下:
这句话的意思是:匹配b开头或者c及后面的所有的字符
是匹配c及后面的字符:返回结果为:ca
如果要匹配b或者c开头的所有的字符,则需要加个()
匹配字符串合集——字符集合[abc]
[abc]表示a或者b或者c中的任意一个字符
也就是说等同于
当需要匹配的字符很多时,用()的这种方式会比较麻烦,则此时可以用[]字符集合的方式来处理
我们在字字符集合中使用如下的表示方式:[a-z],[A-Z],[0-9],分别表示小写字母,大写字母,数字
举例:匹配:开头必须是英文字母,后面可以是英文字母或者数字以及下划线
反字符集合——[^abc]
**^**在正则表达式开始部分的时候表示开头的意思,例如表示开头是c;但是在字符集和中,它表示的是类似“非“的意思,例如就表示不能是a,b或者c中的任何一个。
由此我们可知:表示非数字,表示非小写字母,一次类推。
边界与非边界——b
表示的边界的意思,也就是说,只有字符串的开头和结尾才算数。例如就表示字符串开始的c或者是结尾的c
与b对应B表示非边界
数字与非数字——d
表示数字的意思,相反,表示非数字
空白——f vs
匹配换页符,匹配换行符,匹配回车,匹配制表符,匹配垂直制表符。
匹配单个空格,等同于[f
v]
表示非空格字符
单词字符——w
表示单词字符,等同于字符集合
表示非单词字符,等效于
反向引用——子正则表达式
不记录子正则表达式的匹配结果——?:pattern
不记录子正则表达式的匹配结果
使用形如的正则就可以避免保存括号内的匹配结果。
例如:
可以看到返回的结果不再包括那个括号内的字正则表达式多匹配的内容。
返回 bb,b。bb是整个正则表达式匹配的内容,而b是第一个子正则表达式匹配的内容。
同理,反向引用也不好使了:
返回 null。由于根本就没有记录括号内匹配的内容,自然没有办法反向引用了
正向预查——?=pattern
形式:(?=pattern)
所谓正向预查,意思就是:要匹配的字符串,后面必须紧跟着pattern
我们知道正则表达式会匹配。同样,也会匹配中的。但是我们可能希望,只能匹配中的菜鸟。这
时候就可以像下面这样写:,看两个实例:
需要注意的是,括号里的内容并不参与真正的匹配,只是检查一下后面的字符是否符合要求而已,例如上面的正则,返回的是,而不是。
正向预查取反——?!pattern
形式和恰好相反,要求字符串的后面不能紧跟着某个,还拿上面的例子:
返回 null,因为正则要求,blue的后面不能是idea。
则成功返回 blue。
全局匹配——g
形式:/pattern/g
不区分大小写——i
不区分大小写,修饰符i;
形式:/pattern/i
行首行尾,修饰符m
形式:/pattern/m
m修饰符的作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾;
匹配最后两个数字
最后:可以使用**/`
去掉字符串中的所有的空格
空格:可以使用表示空格
多个空格:字符串中可能有多个空格,可以通过,表示多个前面的匹配,用也可以匹配0个或多个
所有空格:全局匹配的话可以用
所以,匹配字符串中的所有的空格,可以使用或者
判断字符串是否全是数字
判断:则可以使用正则的方法,返回值为布尔值,或
数字:可以使用表示
全是数字:可以通过开头结尾和中间都是数字来区分,开头是数字,结尾是数字,中间也是数字的话,可以直接用,也就是紧跟着开头数字的匹配,或者通过也可以的。
所以:判断字符串是否全是数字,可以使用,也可以使用
座机号码的匹配
首先了解一下座机号码的组成:
3-4位的区号-7-8位的中间号码-3-4位的分机号(可有可无)
开头:3-4位的区号:
结尾:3-4位的分机号(可有可无)
区号必填为3-4位的数字,区号之后用“-”与电话号码连接
^d{3,4}-
电话号码为7-8位的数字
d{7,8}
分机号码为3-4位的数字,非必填,但若填写则以“-”与电话号码相连接
(-d{3,4})? 单独的?表示0个或1个,就是有无都可以