【正则】JavaScript正则表达式

一、元字符

这里写图片描述


二、修饰符

这里写图片描述


三、属性

这里写图片描述


四、贪婪模式&&非贪婪模式

正则表达式会尽可能多的匹配,直到无法匹配,我们称之为贪婪模式
下面的数字匹配会返回能匹配到的最多的数字

var str = "123456789";
str.replace(/\d{3,6}/, 'x'); //x789

非贪婪模式和贪婪模式正相反,会尽可能少的匹配,只要在量词后面添加?即可变为非贪婪模式

var str = "123456789";
str.replace(/\d{3,6}?/, 'x'); //x456789

五、反向引用

可以通过$组数来引用分组匹配

var str = "1a2b3c4d";
str.replace(/\d(\S)/g, '$1'); //abcd

六、非捕获性分组

分组可以通过()来表示,分组匹配到的数据会暂存起来,以便反向应用,然后 非捕获性分组只用作匹配用,而不会把分组匹配到的数据暂存,能提高匹配速度,通过(?:)来表示非捕获性分组

var str = "ab1cd2";
str.match(/(ab)+\d+(cd)+\d+/); //['ab1cd2', 'ab', 'cd']
str.match(/(?:ab)+\d+(?:cd)+\d+/); ['ab1cd2'] 无分组匹配的信息

七、先行断言(前瞻)&&后行断言(后顾)

正则的匹配是从左到右进行匹配的,右边被称为先(前),左边被称为
先行断言即当匹配到某个值后,向检查是否符合断言,符合断言的称为先行断言,符合的称为先行否定断言后行断言正好相反

先行断言:exp(?=assert)
先行否定断言:exp(?!assert)

var str = "xyxaxy";
//只有当x右边为y时才能匹配成功,且断言不参与替换
str.replace(/x(?=y)/g, '1'); //1yxa1y

JS语言的正则表达式,只支持先行断言和先行否定断言,不支持后行断言和后行否定断言。ES2018 引入后行断言,V8引擎4.9版(Chrome 62)已经支持。

后行断言:(?<=assert)exp
后行否定断言:(?<!assert)exp

var str = "xyxaxy";
//只有当y左边为x时才能匹配成功,且断言不参与替换
str.replace(/(?<=x)y/g, '1'); //x1xax1

八、方法

字符串对象共有 4 个方法,可以使用正则表达式:match()replace()search()split()

正则对象有两个方法可以匹配字符串reg.test(str)reg.exec(str)

1.match -> str.match(reg)

match返回的是个数组

  • 当非全局搜索时,数组第一个值为匹配的文本,后面依次为分组匹配到的文本,非全局搜索时,match还会返回额外的属性,index匹配文本的起始位置,input进行匹配的文本
  • 当为全局搜索时,返回的数组为所有匹配到的文本
  • 未匹配到文本时,返回null
2.replace -> str.replace(reg, str|fun)

replace的替换值可以是个函数,函数接收的参数为

  • match 匹配到的文本
  • group1、group2.. 分组匹配的信息,有多少分组传入多少,如果没有分组则无该参数
  • index 匹配到的文本位置
  • origin 进行匹配的文本
3.search -> str.search(reg)

search返回的是匹配到的文本的第一个字符位置,如果没有匹配到,则返回-1,且每次调用时都是从文本的第一个字符开始匹配,即lastIndex总为0

4.test -> reg.test(str)

test返回的是个Boolean,即是否有匹配中的值,若匹配则返回true,否则返回false,test方法每次从上次lastIndex开始,即上次匹配文本的下一个字符开始进行查找匹配

5.exec -> reg.exec(str)

exec和match方法类似,返回的是一个数组

  • 数组第一个值为匹配的文本,后面依次为分组匹配到的文本,会返回额外的属性,index匹配文本的起始位置,input进行匹配的文本
  • 不支持全局搜索
  • 未匹配到文本时,返回null
原文链接:加载失败,请重新获取