何为前瞻后顾
何为前瞻后顾?在正则表达式中,匹配顺序是从左向右匹配,正则表达式中的“前”指的是需要匹配部分的右边。而“后”指的是需要匹配部分的左边。可以这样理解,正则表达式的匹配顺序就像是走路,走过的路是后边,前边是即将要走的路。
var str = '123456789';
// 假设以str中的数字5为需要匹配的部分,那么1234就是后,6789就是前
前瞻后顾的匹配模式
(?=pattern) 前瞻
前瞻:正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?=95|98|NT|2000)"能匹配“Windows2000”中的“Windows”,但不能匹配"Windows3.1"中的"Windows"。预耗不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
var str = '<span>a&b';
//我想要匹配str中的&符号,但只想匹配<和>中的&,不想匹配a&b中的&
var reg = /&(?=lt|gt)/g; 匹配模式
var res = str.replace(reg, '哈哈')
console.log(res) // 哈哈lt;span哈哈gt;a&b
从上面可以看出,/&(?=lt|gt)/ 表示只匹配&符号前面是lt或gt的& ,
而a&b中的&前面是b,不满足匹配模式,所以匹配不到(注意这里的前后,代表左右。前是右,后是左)
(?!pattern) 负前瞻
负前瞻:正向否定预查,在任何不匹配的pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
从负前瞻的引语中可以知道,负前瞻其实就是前瞻的一个取反模式
var str = '<span>a&b';
// 我想要匹配str中的&符号,但只想匹配a&b中的&符号,不想匹配<和>中的&var reg = /&(?!lt|gt)/g; 匹配模式
var res = str.replace(reg, '哈哈')
console.log(res) // <span>a哈哈b
从上面可以看出,/&(?!lt|gt)/ 表示只匹配&符号后面不是lt或gt的&
(?<=pattern) 后顾
反向肯定预查,与正向肯定预查类似,只是方向相反。例如 "(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的Windows,但是不能匹配“3.1Windows”中的"Windows"。
所以,后顾就是从左边查询
var str = 'nobody somebody everybody';
// 我只想匹配somebody中的body
var reg = /(?<=some)body/g; // 匹配模式
var res = str.replace(reg, 'one');
console.log(res) // nobody someone everybody
(?<!pattern) 负后顾
反向否定预查,与正向否定预查类似,只是方向相反。例如,"(?!=95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
var str = 'nobody somebody everybody';
// 我想匹配str中的body字段,但要排除somebody中的body
var reg = /(?<!some)body/g; // 匹配模式
var res = str.replace(reg, 'one');
console.log(res) // noone somebody everyone