什么是正则
正则是就是一个规则,处理字符串的规则
正则的匹配
判断字符串是否符合规则--reg.test(str)
正则的捕获
捕获到符合规则的字符串中的内容--reg.exec(str)
创建方式
1、对象字面量方式
var reg = /\d/
2、实例创建方式
var reg = new RegExp('\\d');
3、两种方式区别
1)字面量创建方式中,两个斜杠之间都是元字符
2)针对要求字符串拼接的需求,只能用实例创建方式
var reg1 = new RegExp('^\\d+'+ name + '\\d+$', 'g');
元字符
在//之间有自身意义的字符,每个元字符都由元字符和修饰符组成。
具有特殊意义的元字符
- \ 转义字符
- ^ 以某个元字符开始
- $ 以某个元字符结束
- \n 匹配一个换行符
- . 除\n之外任意字符
- () 分组,把大正则,划分几个小正则
- x|y x或者y
- [xyz] xyz中的一个字符
- [^xyz] xyz之外的任何一个字符
- [a-z] a到z之间任何一个字符
- \d 0-9之间任何一个数字
- \b 匹配一个边界符
- \w 数字、字母、下划线中的一个
- \s 匹配一个空白符(空格,制表符,换页符)
- \D 非数字
- \B 非边界符
- \W 非数字,非字母,非下划线
- \S 非空白符
代表出现次数的量词元字符
- '*' 0-多次
- '+' 1-多次
- '?' 0-1次
- {n} n次
- {n,} n到多次
- {n,m} n-m次
中括号的特点
1、中括号中所有字符都只代表本身的意思,没有特殊含义
var reg2 = /^[.]$/;
console.log(reg2.test('1')); //false
console.log(reg2.test('.')); //true
2、中括号不识别两位数
增则捕获的懒惰性和贪婪性
懒惰性:匹配到第一个符合的就结束
贪婪性:每次都匹配最长结果
解决懒惰性
g:global
var str = '12345';
var r1 = /\d/;
console.log(str.match(r1)); // ["1", index: 0, input: "12345", groups: undefined]
var r2 = /\d/g;
console.log(str.match(r2)); // ["1", "2", "3", "4", "5"]
解决贪婪性
量词元字符后加?
var str = '12345';
var r1 = /\d+/;
console.log(str.match(r1)); // ["12345", index: 0, input: "12345", groups: undefined]
var r2 = /\d+?/;
console.log(str.match(r2)); // ["1", index: 0, input: "12345", groups: undefined]
?的作用
1、普通元字符后,表示出现0-1次
2、量词元字符后,取消捕获的贪婪性
3、在(?:)在分组中,表示只匹配不捕获
分组的租用
1、改变优先级
2、分组引用
// 注意 \2代表第二个分组出现一模一样的内容;\1代表和第一个分组出现一模一样的内容;
// 一模一样,表示值也一样。
var r3 = /^(\w)\1(\w)\2$/;
r3.test('xxll');
3、分组捕获,正则捕获时先匹配大正则,再匹配小分组
字符串replace和正则结合使用
var s5 = 'z123z345';
// console.log(s5.replace(/(z)\d+/g, 'xl'));
// 首先和exec相同,把所有符合正则的全都捕获到,然后把捕获到的内容,全都替换成目标内容。
s5.replace(/(z)\d+/g, function () {
console.log('ok');
console.log(arguments); //和exec捕获到的结果类似
console.log(RegExp.$1); //获取分组中的内容。 ie下不兼容
return 'xl';
})