正则表达式之前瞻后顾

586 阅读3分钟

何为前瞻后顾

何为前瞻后顾?在正则表达式中,匹配顺序是从左向右匹配,正则表达式中的“前”指的是需要匹配部分的右边。而“后”指的是需要匹配部分的左边。可以这样理解,正则表达式的匹配顺序就像是走路,走过的路是后边,前边是即将要走的路。

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)/ 表示只匹配&符号后面不是ltgt的& 

(?<=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

以上就是我对正则表达式中前瞻后顾的一些理解