正则表达式中?=等的简单使用

关于正则表达式 ?= ?: ?! 这些符号的用处

今天写web作业的时候遇到一个问题,如何使用提取url中请求的html,css和js的请求
于是我使用了正则表达式来做,前面一直没搞懂 ?= ?: ?!这几个符号是的用处,今天好像清晰了不少,记录一下
首先是要求
如何使用正则表达式匹配 /[字符串].html 中的 [字符串]

首先我是这样写的

let css = res.url.match(/^\/.+.css$/)

确实能匹配到 /index.html 但是 css[0] = '/index.html' 但是得到的是全匹配的字符串
这里可以使用 ()来分组匹配项,也能得到中间的字符串,不过下面用?= ?!这些符号来实现

要提取出 index 就需要用到 ?: ?= 这些符号 不匹配最后面的 ‘.html’

?= (非获取匹配,正向肯定预查询)

let hrml = res.url.match(/^\/.+(?=.css$)/)

相反的 如果要去掉前面多的 / 则使用下面的

?<= (非获取匹配,反向肯定预查询) 跟正向的预查寻就多了个 <

let html = res.url.match(/(?<=^\/).+.css$/)

上面2个正则表达式合起来就能只完成 字符串匹配且只保留中间要的字符串

let html = urlObj.pathname.match(/(?<=^\/).+(?=\.html$)/);

?=是肯定查询 那?!就很明显就是否定的查询 以下是例子

str.match(/good(?!morning)/)

这个正则表达式匹配的是 'good'+(不是morning) 的句子
goodmorning 就不能匹配
goodafternoon 能匹配且 match以后拿到的是 good

str.match(/(?<=state)ment)/)

这个正则表达式匹配的是 (不是state)+'ment' 的句子 且match拿到的是 morning
statement 就不能匹配
document 能匹配且 match以后拿到的是 ment

?:不捕获分组

这个写得很明白易懂 不捕获分组
这个的匹配效果和不加是一样的,位于不同的是match的时候,这个分组不会出现在结果数组里

总结

使用正则表达式匹配的时候
如果只要匹配模式字符串的一部分,可以使用以上的这些符号
如果要去除的字符串在保留串的前面,使用反向的预匹配 ?<=
如果在后面则使用正向的预匹配 ?=
!则表示非的意思 <表示的是反向

猜你喜欢

转载自blog.csdn.net/reol44/article/details/121047951