一、元字符
二、修饰符
三、属性
四、贪婪模式&&非贪婪模式
正则表达式会尽可能多的匹配,直到无法匹配,我们称之为贪婪模式
下面的数字匹配会返回能匹配到的最多的数字
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