js正则表达式中的正向肯定预查和正向否定预查
对于没有使⽤过这⼏个表达式的⼈,应该对这个概念都有点不太理解,下⾯就以实际例⼦说明这⼏个表达式的⽤户。
⼀、?:pattern——匹配检验:
会作为匹配校验,是⼀个⾮获取匹配,并出现在匹配字符结果⾥⾯,⽐如 windows(?:2000|NT|98) 等同于
windows2000|windowsNT|windows98
就是⼀个⽐⽤ | 更简略的表达式,跟直接⽤ | 的区别是不作为⼦匹配返回:
例1:
var reg1=/windows(?:2000|NT|98)/i
var reg2=/windows(2000|NT|98)/i
var str='windows2000'
str.match(reg1) // ["windows2000", index: 0, input: "windows2000"]
str.match(reg2) // ["windows2000", "2000", index: 0, input: "windows2000"]
可以注意到第⼀个正则匹配返回的结果中没有⼦匹配的返回内容
⼆、?=pattern——正向肯定预查:
会作为匹配校验,是⼀个⾮获取匹配,不会出现在匹配结果字符串⾥⾯。
⽰例:
var reg=/windows(?=2000|NT|98)/i
var str='windows2000'
var str2='windows xp'
str.match(reg) // ["windows", index: 0, input: "windows2000"]
js实现正则表达式校验str2.match(reg)    //null
其中,
1. 匹配windows,如果没有匹配到,那么就返回为空
2. 其后是否有2000|NT|98其中的⼀个,如果有,那么就返回 windows,没有就返回为空
三、?!pattern——正向否定预查:
在任何不匹配pattern的字符串开始处匹配查字符串,也是⼀个⾮获取匹配,不会出现在匹配结果字符串⾥⾯。
⽰例:
var reg=/windows(?!2000|NT|98)/i
var str='windows2000'
var str2='windows xp'
str.match(reg) // null
str2.match(reg)    //["windows", index: 0, input: "windows xp"]
可以看到,跟上边正想肯定预查刚好相反。
上边的例⼦是?!前边直接匹配字符串,还有⼀种情况,就是元字符,如下例:
var reg=/windows*(?!2000|NT|98)/i
var str='windows2000'
var str2='windows xp'
str.match(reg) // ["window", index: 0, input: "windows2000"]
str2.match(reg)    //["windows", index: 0, input: "windows xp"]
*在正则表达式中的意思是匹配前⼀个⼦表达式0次或者多次,那么对于str,能够匹配 ?! 后边的表达式,所以取反,即不匹配*前边的表达式(这⾥是 s ),匹配结果为window,str2中恰好相反。
注:下边这个例⼦可能不太好理解,多写⼏个表达式熟悉下慢慢就理解了。