正则表达式
1、正则表达式基础
创建正则表达式
var reg = new RegExp('正则内容',修饰符)//构造函数创建
var reg = /正则内容/ //字面量创建
正则修饰符 i,g,m;
i 表示为不区分大小写
g 表示为全局匹配
m 多行匹配
正则对象的方法:
test() 判断参数中的字符串有没有匹配正则表达式的内容,返回值为一个布尔值。
var reg = /a/i;
var bool = reg.test('bkAdc');
console.log(bool)
exec() 返回一个数组,表示exec()参数中字符串匹配的正则内容,不会全局匹配;
var reg = /a/i;
var arr = reg.exec('bkAdc');
console.log(arr)
字符串方法:
search() 只能找到第一个,不能全局匹配,返回找到内容的下标。
var str = 'sAkjfvsa';
var index = str.search(/a/i);
console.log(index)
match() 把找到匹配的元素用数组罗列,如果没有全局匹配和exec相同。
var str = 'sAkjfvsa';
var arr = str.match(/a/ig);
console.log(arr)
replace() 把找到的匹配到的元素替换。当使用全局匹配时,可以完成所有元素的匹配替换
var str = 'sAkjfvsa';
str = str.replace(/a/ig,'z');
console.log(str)
split() 可以将匹配到的元素进行切割,返回一个数组。
var str = 'sAkjfvsa';
var arr = str.split(/a/ig,'z');
console.log(arr)
2、元字符
. 匹配任何一个字符,是一个通配符
\.把通配符.转为字符。
var str = 'catcbtctbcabtc/t';
console.log(str.match(/c.t/g))
[]表示匹配其中任意一个
[a-z]表示匹配a-z其中
在[]中的,就是转义符,不是通配符。
但在[]中所有的括号必须增加转义。
两个\在字符或者正则表达式的[]都是一个\
var str = 'catcbtctbcabtc/t';
console.log(str.match(/c[abcdefg]t/g));
console.log(str.match(/c[a-g]t/g))
console.log('aa\\a\a'.match(/[\\]/g));
[aaazzzzdddd] 无意义
[a-Z]错误的Unicode编码中a比Z大
[A-z]错误大写Z到a中间还有其他字符串
在[]内第一个字符是^,表示后面的字符取反
console.log('abcdef'.match(/[^d]/g))
[a-zA-Z0-9]表示所有数字和字母;
\w 表示所有数字字母下划线
\W对\w取反
\d表示所有数字
\D表示对\d取反
\s表示所有空格
\S表示对\s取反
/[\u4e00-\u9fa5]/ 匹配中文字符
3、重复次数
{n}表示重复n次
console.log('aaaaaaaaa'.match(/a{6}/g))
{n,m}表示最少重复n次最多重复m次,他会先匹配最大的字符
console.log('aaaaaaaaaaaaa'.match(/a{2,4}/g))
{n,}表示至少n次
console.log('aaaaaaaa'.match(/a{1,}/g))
{0,}表示可以没有也可以若干个,会打印空白
console.log('aaaaaaaa'.match(/a{0,}/g))
/a*/g 就相当于 /a{0,}/g
/a+/g 就相当于/a{1,}/g
/a?/g 就相当于 /a{0,1}/g
贪婪模式与非贪婪模式
贪婪模式
它会先匹配最大的字符,然后再考虑少的字符。
console.log('aaaaaaaaaaaaa'.match(/a{2,4}/g))
非贪婪模式,它会优先去匹配少的字符。
一般就给可以匹配多个字符后面加?字符。
var str = "<p>Uber的这款无人车原型配备了多个<strong>摄像头</strong>、<em>激光雷达</em>以及<span>传感器</span>,可看清100米范围内任何方向的东西</p><br/><p>第二行内容,哎嘿,第二行内容</p>";
str = str.match(/<.*?>/g);
相同重复 /1
var str="aaabbffddeeaaggfddssaaggeer".split("").sort().join("").match(/(\w)\1*/g)
/(\w)\1是指匹配字符重复的次数
4、选择和起始结束
要完成一个全体内容就需要使用起始和结束符来操作
^起始符,表示开始从这个开始匹配
$结束符,表示必须以某个字符结尾
console.log('bbaacc'.match(/^a+/g));//要求其实必须是一个或多个a以上
console.log('bbaacc'.match(/c+$/g))//要求必须是一个c或多个c结尾
5、群组
用()括起来的内容
当使用match时,如果使用群组,加上g和不加g是有差距的。
不加g可以将每个群组列表在数组的下标1开始的元素;加g就不能找到群组的内容
在replace中如果不使用群组,后面的函数中参数第一位是符合正则的内容,第二位就是这个字符的下标。
在replace中如果使用群组,后面的函数中参数分别是符合正则的内容,和每个群组的内容。
var str="10[a]3[bc]".replace(/(\d+)\[([a-zA-Z]+)\]/g,function(item1,item2,item3){
return item3.repeat(item2);
});
6、断言
前瞻断言(先行断言),紧随其后
console.log('abac'.match(/a(?=b)/g))
查找紧随其后的内容是某个字符的条件
console.log('abac'.match(/a(?!c)/g))
查找紧随其后的内容不是某个字符的条件
后瞻断言(后行断言),紧随其前
console.log('abcb'.match(/(?<=a)b/g))
前面必须是某个条件,紧随其后的字符
console.log('abcb'.match(/(?<!a)b/g))
前面必须不是某个条件,紧随其后的字符。