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"] reg1.test(str) //true reg2.test(str) //true
可以注意到 第一个正则匹配返回的结果中没有子匹配的返回内容
二、?=pattern——正向肯定预查:
会作为匹配校验,是一个非获取匹配,不会出现在匹配结果字符串里面。
示例:
var reg=/windows(?=2000|NT|98)/i var str='windows2000' var str2='windows xp' str.match(reg) // ["windows", index: 0, input: "windows2000"] 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中恰好相反。
注:下边这个例子可能不太好理解,多写几个表达式熟悉下慢慢就理解了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了