正则

334 阅读2分钟

什么是正则

正则是就是一个规则,处理字符串的规则

正则的匹配

判断字符串是否符合规则--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';
})