捕获组和前后查找
捕获组()
捕获的顺序由左括号出现的顺序决定。
引用
被正则表达式匹配到的字符串会被暂存起来,其中分组捕获的串从1开始编号,$1表示第一个被捕获的串,$2是第二个,以此类推,我们可以引用这些串。
var reg = /(\d{4})-(\d{2})-(\d{2})/
var data = '2017-10-24'
reg.test(data)
RegExp.$1//2017
RegExp.$2//10
RegExp.$3//24
反向引用
可以在同一个正则表达式中对前面的内容反向引用,反向引用的方式为\+数字。
var reg = /(\w{3}) is \1/
console.log(reg.test('dot is dot'))//true
console.log(reg.test('dolby is dolby'))//false
console.log(reg.test('dot is tod'))//false
console.log(reg.test('dolby is dlboy'))//false
非捕获组(?: )
有时我们只是想分个组,并没有捕获的需求,这种情况下可以使用非捕获性分组,语法为(?: )
var reg = /(?:\d{4})-(\d{2})-(\d{2})/
var date = '2017-10-24'
console.log(reg.test(date))//true
console.log(RegExp.$1)//10
console.log(RegExp.$2)//24
这个例子中,(?:\d{4})分组不会捕获任何串,所以$1为(\d{2})捕获的串。
前瞻(?=)
正向前瞻
前面会有一个模式串,正则表达式匹配的内容需要满足:与该模式串匹配,且它后面出现的字符串和前瞻表达式中?=后的模式串匹配。
var reg = /dot is a (?=doubi)/
console.log(reg.test('dot is a doubi'))//true
console.log(reg.test('dot is a shadou'))//false
dot is a后面要跟上doubi才匹配成功。
反向前瞻
即后面不能出现满足某种模式的字符串。
var reg = /dot is a (?!doubi)/
console.log(reg.test('dot is a doubi'))//false
console.log(reg.test('dot is a shadou'))//true
dot is a后面除了跟上doubi,都能匹配成功。
后瞻(?<=)
和前瞻类似,只不过是匹配的内容需要满足的是:前面出现内容匹配某个模式串。
参考
[1]正则捕获组