最上面放正则的优先级
①常用的元字符 (一些有特异功能的用来方便匹配的字符)
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线(等价于[A-Za-Z0-9_])
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
^\d{5,12}$ 因为使用了^和$,所以检测的整个字符串都要用来和\d{5,12}来匹配,也就是说整个字符串必须是5到12个数字。
②常用的限定符 (表示它前面的字符重复的次数)
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次(还有非贪婪模式的用法)
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
(?0\d{2}[) -]?\d{8} 首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现0次或1次(?),最后是8个数字(\d{8})。
③字符范围
代码 说明
[] 匹配方括号中任意字符
[0-9] 代表的含意与\d就是完全一致的:匹配任意一位数字
注意在字符范围中有很多元字符不需要转义,可以代表自身,如.?+等。常见在[]内需要转义的有\和]和-
注:如果想匹配任意汉字的话,可以使用:[\u4e00-\u9fa5]。
有时也会见到[^\x00-\xff],即匹配不是ASCII代码中十六进制代码00到ff的字符,即不是ASCII代码十进制0到255的字符,所以汉字包括在里面。
④分枝条件
代码 说明
| 匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
\d{5}-\d{4}|\d{5} 这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
⑤分组
代码 说明
() 重复单个字符,直接在字符后面加上限定符就行了;但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了
(\d{1,3}.){3}\d{1,3} 是一个简单的IP地址匹配表达式。 \d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
但使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:
常用分组语法
分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置(断言:是真的才执行。所以在这里是exp才会匹配它前面的字符)
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
⑥反义
代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
<a[^>]+> 匹配用尖括号括起来的以a开头的字符串。
⑦零宽断言(环视、断言)
环视,就是先从全局环顾一遍正则,(然后断定结果,)再做进一步匹配处理。
断言,就是先从全局环顾一遍正则,然后断定结果,再做进一步匹配处理。
两个虽然字面不一样,意思却是同一个,都是做全局观望,再做进一步处理。
环视的作用相当于对其所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。
代码/语法 说明
(?=exp) 先行断言:匹配后面是exp的数据(断言:是真的才执行。所以在这里是exp才会匹配它前面的字符)
(?!exp) 先行否定断言:匹配后面不是exp的数据
(?<=exp) 后行断言:匹配前面是exp的数据 (JS在ES6才支持后行断言)
(?<!exp) 后行否定断言:匹配前面不是exp的位置
eg:前端的一道笔试题:模拟数字的千位符
⑧贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
JS中有两种方式创建正则表达式对象,eg:下面创建一个匹配字符串的正则表达式对象
1 | //一、正则表达式字面量方法 |
其它具体请参考:快速入门正则表达式