参考文章:
https://www.zhihu.com/question/48219401/answer/1476436385
一、什么是正则表达式?
正则表达式(Regular Expression)是一种文本模式,其使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。这里的文本模式我理解成一种文本的一种标准格式,就像年月日格式的日期是yyyy-mm-dd
。
二、为什么使用正则表达式?
(1)验证:看看字符串是不是符合某个模式,比如用行用户名密码的验证。
(2)查找:从大量信息中快速提取指定内容,比如在一些ip中,查找指定ip。
(3)替换:将指定格式的文本进行正则匹配查找,找到之后进行特定替换或者删除。
三、字符匹配
正则表达式由普通字符和特殊字符(元字符,$,(),*,+,[,?,\,^,{,|
)组成,其中普通字符包括没有显式指定为元字符的所有可打印(所有的大小写字母、数字、标点符号)和不可打印字符(\f,\n,\r,\s,\S,\t......
)。
具体看:https://www.runoob.com/regexp/regexp-metachar.html
这里记几个感觉常用的:
符号 | 意义 |
---|---|
[^ABC] | 匹配除了 […] 中ABC的所有字符 |
\w | 匹配字母、数字、下划线 |
^ | 不在[]里,代表匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结尾位置 |
\d | 一位数字 |
. | 匹配除换行符 \n 之外的任何单字符 |
aa|bb | 匹配aa或bb |
限定符
字符 | 意义 |
---|---|
? | 前面的字符最多只可以出现一次(0次、或1次) |
+ | 前面的字符必须至少出现一次(1次或多次) |
* | 前面的字符可以不出现,也可以出现一次或者多次不那么久(0次、或1次、或多次) |
{n} | 匹配确定的 n 次 |
{n,} | 至少匹配n 次 |
{n,m} | 最少匹配 n 次且最多匹配 m 次 |
注意:不能将限定符与定位符(^,$,\b,\B
)一起使用
*
和 +
限定符都是贪婪的,即会尽可能多的匹配文字,e.g.
var str = "abcd jrj@qq.comtest@runoob.com 1234";
var patt1 = /\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g;
document.write(str.match(patt1));
qq.comtest@runoob.com
只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
四、组
1.捕获组&非捕获组
字符 | 意义 |
---|---|
() | 捕获组capture group,()会把相关匹配存储到一个临时缓冲区,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问(回溯引用backreference),其中 n 为一个标识特定缓冲区的一位或两位十进制数。 |
(?: ) | non-capturing group,不想让后面的选项的相关匹配被缓存 |
e.g.
\1匹配的是[1-6],\0是整个正则表达式
2.先行断言lookhead
字符 | 意义 |
---|---|
a(?=b) | positive lookhead,先行断言,a只有在b前面才匹配 |
a(?!b) | negative lookhead,先行否定断言,a只有不在b前面才匹配 |
3.后行断言lookbehind
字符 | 意义 |
---|---|
(?<=b)a | positive lookbehind,后行断言,a只有在b后面才匹配 |
(?<!b)a | negative lookbehind,后行否定断言,a只有不在b后面才匹配 |
五、修饰符
字符 | 意义 |
---|---|
i | 不区分大小写 |
g | 全局匹配 |
m | 多行匹配,使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 . 中包含换行符 \n |
e.g.
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./); // 没有使用 s,无法匹配\n
var n2=str.match(/google./s); // 使用 s,匹配\n
document.write(str.match(n1));
document.write("<br>");
document.write(str.match(n2));
结果:
null
google