关于正则表达式 ?=
?:
?!
这些符号的用处
今天写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的时候,这个分组不会出现在结果数组里
总结
使用正则表达式匹配的时候
如果只要匹配模式字符串的一部分,可以使用以上的这些符号
如果要去除的字符串在保留串的前面,使用反向的预匹配?<=
如果在后面则使用正向的预匹配?=
!
则表示非的意思<
表示的是反向