Skip to content

正向预查

🕒 Published at:

一些帮助理解的例子

js
let str = 'abaaaaaaaaaaa'
let reg = /a(?=b)/g
// (?=b)是a的修饰条件,意思是a后面跟着b的a
// (?!b)是指a后面跟着不是b的a
console.log(reg.test(str)) // true
console.log(str.match(reg)) // ['a']
js
// ?有取消贪婪匹配的功能
let str1 = 'aaa'
let reg1 = /a?/g
console.log(str1.match(reg1)) // ['a', 'a', 'a', '']
js
// +表示1个或多个
// *表示0个或多个
// ?表示0个或1个
// {2,}表示2个或多个,以此类推

// 默认是贪婪匹配,会匹配到所有a
let str = 'aaaa'
let reg = /a+/g
console.log(str.match(reg)) // ['aaaa']

// 但是如果在量词+后面加一个?,就会打破贪婪匹配原则,一个一个匹配
let reg1 = /a+?/g
console.log(str.match(reg1)) // ['a', 'a', 'a', 'a']

// 类似的还有{1,3},加了?号之后是能匹配1个,绝不匹配3个
let reg2 = /a{1,3}?/g
console.log(str.match(reg2)) // ['a', 'a', 'a', 'a']

// 如果不加默认是贪婪匹配,能匹配3个,绝不匹配一个
let reg3 = /a{1,3}/g
console.log(str.match(reg3)) // ['aaa', 'a']

// 两个??的情形,需要注意的是,第一个?表示量词,第二个?表示取消贪婪匹配
let reg4 = /a??/g
// 全匹配0个,因此全是空串,因为有5个间隔,所以是5个空串
console.log(str.match(reg4)) // ['', '', '', '', '']

let reg5 = /a*?/g
// 全匹配0个,因此全是空串,因为有5个间隔,所以是5个空串
console.log(str.match(reg5)) // ['', '', '', '', '']