一、创建正则的两种方式
1. 字面量方式
var reg = /\d+/
字面量方式//之间包起来的都是元字符,有的是具有特殊意义的元字符,大部分是代表本身含义的普通元字符
2. 实例创建
var reg = new RegExp("\\d+")
两种方式的区别
(1)字面量方式中出现的都是元字符,不能进行变量的拼接,而实例创建的方式可以
eg: var reg = new RegExp("\\d+"+name) //name是一个变量
(2)字面量方式中可以直接写\d,但是在实例创建中需要转义\d,所以应该写\\d,否则则是匹配真实的"\d"字符串
二、正则中常见的元字符
1. 具有特殊意义的元字符
\:转义字符
^:以XXX开头
$:以XXX结尾
\n:换行
.:除了\n以外的所有字符
():分组
分组的作用:
(1)改变优先级,就像我们算数中的一样,通过括号改变优先级
eg: var reg = /^18|19$/ (代表以1开头,9结尾都可以满足)
var reg = /^(18|19)$/代表18或者19
(2)分组捕获,这点可以看下面的正则分组
x|y:x或者y中的一个
[xyz]:x,y,z中的一个(xyz只识别一位的)
[^zyz]:不是x,y,z中的一个
\d:一个0-9之间的数字
\D:除了0-9的数字的任意字符
\b:一个边界符
\w:数字字母下划线[a-zA-Z0-9_]
\s:匹配一个空白字符,包括一个空格、制表符、换页符等
2.代表量词的元字符
*:0到多次
?:0或者1次(放在表示量词的元字符后面是解决贪婪性的)
+:1到多次
{n}:n次
{n,}:n到多次
{n,m}:n到m次
三、正则的匹配
test
判断一个字符串是否符合我们指定的规则
四、正则的捕获
exec
1.捕获的格式
捕获到的是一个数组,如下
数组第一项:大正则捕获到的内容
index:捕获内容在字符串中开始的索引位置
input:原始字符串
2.捕获的特点
(1)懒惰性
只捕获第一个匹配内容,在不做任何处理的情况下在执行多次捕获时永远从第一个字符开始,捕获到的永远是第一个匹配的内容
lastIndex:每一次捕获时在字符串中查找的开始位置,默认是0,多次执行exec,还是从第一个字符开始匹配
解决懒惰性:
修饰符:
g:全局
i:不区分大小写
m:多行匹配
解决办法:
正则加全局修饰符g,正则每一次捕获结束后,lastIndex都会变成最新的
从上图可以看出lastIndex每次都从新的位置开始匹配,当匹配不到时就是null,所以要想得到全部的匹配项我们可以这样做
(2)贪婪性
每次捕获都是按匹配的最长字符捕获的,例如2符合2015也符合则捕获2015
如何解决贪婪性?在量词后面加?
eg:var reg = /\d+?/
match
match可以解决exec需要通过循环才能获取到全部匹配项的问题
match虽然简单,但是match只能捕获大正则要捕获的内容,不能捕获分组后小正则要捕获的内容
五、正则分组捕获
1.正则分组作用
(1)改变优先级
(2)分组捕获
\1和第一个分组一模一样的内容,\2表示和第二个分组一模一样的内容
eg:var reg = /(\w+)\1(\w+)\2/;
reg.test('afaf') //->false; reg.test('aaff') //->true
2.分组捕获获取到的数组
数组中:
第一项:大正则捕获到的数据
第二项:第一个分组捕获到的数据
第二项:第二个分组捕获到的数据
...
(?:)在分组中的意思是只匹配不捕获
六、replace
作用:字符串的替换,在不使用正则的情况下,每一次只能替换一个,而且每次替换时和exec一样,都是从第一个字符串开始替换
replace方法的第二个参数也可以是一个函数
(1)匿名函数执行多少次取决于正则捕获多少次
(2)匿名函数的参数值类似与exec捕获到的数组,可以通过arguments获取到分组捕获的内容
(3)return就是要替换成的内容
这些大概就是正则的所有应用了,整理下来方便之后查看