正则表达式
2017-11-04 本文已影响0人
squall1744
先上干货,两个强烈推荐网站
正则表达式可视化
正则表达式在线工具
下面是正文了,其实也不是什么正文,就是点总结的笔记吧,其实最精华的就是上面那两个网站,下面大家想看就看不想看就不看了吧
元字符
( [ { \ ^ $ | ) ? * + .
字符 | 含义 |
---|---|
\t | 水平制表符 |
\r | 回车符 |
\n | 换行符 |
\f | 换页符 |
\cX | 与X对应的控制字符(Ctrl + X) |
\v | 垂直制表符 |
\0 | 空字符 |
字符类
一般情况下一个字符对应字符串一个字符,如表达式 abc的含义就是
匹配单个字符串
范围类
使用[]可以表示一类字符
[a-zA-Z0-9] //匹配所有字母(包括大小写)和数字
匹配一类字符
预定义类
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 菲数字字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r | 非空白符 |
\w | [a-zA-Z0-9_] | 单词字符,字母、数字和下划线 |
\W | [^a-zA-Z0-9_] | 非单词字符,字母、数字和下划线 |
学了上面这些类,我们写一些正则表达式就很方便了,比如我们希望匹配一个ab+数字+任意字符
,可以这么写:
ab\d.
ab\d.
字符 | 含义 |
---|---|
^ | 以xxx开头 |
$ | 以xxx结尾 |
\b | 单词边界 |
\B | 非单词边界 |
例如,我们要匹配一个字符串为国内手机号可以用下面代码
^1[3578]\d{9}$
匹配国内电话号码
量词
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m |
{n,} | 至少出现n次 |
{,m} | 最多出现m次 |
举例
'a12345678cde'.match(/[a-z]\d?/g)
> ['a1', 'b6', 'c', 'd', 'e']
[a-z]\d?
贪婪模式和非贪婪模式
量词在默认情况下是尽可能多的匹配的,也就是大家说的贪婪模式
'123456789'.match(/\d{3,5}/g)
>['12345', '6789']
非贪婪模式
下,正则表达式尽可能少的匹配,做法很简单,在量词后面加上?即可
'123456789'.match(/\d{3,5}?/g)
>['123', '456', '789']
举例
//贪婪模式
'a12345b678ced'.match(/[a-z]\d?/g)
>['a1', 'b6', 'c', 'd', 'e']
//非贪婪模式
'a12345b678ced'.match(/[a-z]\d??/g)
>['a', 'b', 'c', 'd', 'e']
//贪婪模式
'a12345b678ced'.match(/[a-z]\d+/g)
>['a12345', 'b678']
//非贪婪模式
'a12345b678ced'.match(/[a-z]\d+?/g)
>['a1', 'b6']
//非贪婪模式
'a12345b678ced'.match(/[a-z]\d*?/g)
>['a', 'b', 'c', 'd', 'e']
分组
单个字母加量词只能对一个字母匹配多次,有时候我们需要对多个字符同时使用量词,如希望匹配某个单词出现多少次的字符串,我们如果写成word{20}
话匹配的是wor+d重复20次
word{20}
word{20}
如果怎样才能把word看成一个整体呢?使用()
就可以了,这就是我们所说的分组
(word){20}
(word){20}
或
我们需要匹配word或者number出现20次怎么弄?使用
|
即可
(word|number){20}
(word|number){20}
前瞻
正则表达式中的前和后和我们一般理解的前后有点不同
。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的,因此对于文本尾部方向,因为这个时候正则引擎还没走到那块,所以他是正则的前方
。而对文本头部方向,因为正则引擎已经走过了那一块地方,所以他是正则的后方
。如下图所示:
前瞻表达式
表达式 | 含义 |
---|---|
exp1(?=exp2) | 匹配后面是exp2的exp1 |
exp1(?!exp2) | 匹配后面不是exp2的exp1 |
举例
good(?=word)
good(?=word)
(/good(?=game)/).exec('goodgame123'); //['good']
(/good(?=game)/).exec('goodluck123'); //null
(/good(?=game)/).exec('goodmum123'); //null
通过上面的例子可以看出只有在exp1后面的表达式是exp2的时候才会匹配exp1
结束语
关于正则表达式的常用语法,我们就讲完了,其实就常用语法来说,正则表达式并没有什么太多的内容,但是用起来呢就。。。。