正则表达式的先行断言(lookahead)和后行断言(lookbehind)
- Published on
- 发布于·预估阅读4分钟
- 关于正则的先行断言(lookahead)和后行断言(lookbehind)总共分为4种,如下所示
- 零宽正向先行断言p(?=pattern)
- 零宽负向先行断言p(?=pattern)
- 零宽正向后行断言(?<=pattern)p
- 零宽负向后行断言(?<!pattern)p
- 应用
- 关于charles中使用rewrite来将测试环境or开发环境的静态资源代理到本地,而接口则不处理,这个时候就需要用到负向先行断言,将api部分排除掉;
- 所以我们使用负向先行断言,排除掉所有的api请求,这样就可以直接在本地,调试与开发测试|生产环境的功能
- 匹配url后面的路径
- 参考链接
- Authors
- Name
- willson-wang
关于正则的先行断言(lookahead)和后行断言(lookbehind)总共分为4种,如下所示
- 零宽正向先行断言
p(?=pattern)
- 零宽负向先行断言
p(?!pattern)
- 零宽正向后行断言
(?<=pattern)p
- 零宽负向后行断言
(?<!pattern)p
关于正向(positive)和负向(negative):正向就表示匹配括号中的表达式,负向表示不匹配 关于先行(lookahead)和后行(lookbehind):先行匹配后面,后行匹配前面,专业术语,正则引擎在扫描字符的时候,从左往右扫描,匹配扫描指针未扫描过的字符,先于指针,故称先行;匹配指针已扫描过的字符,后于指针到达该字符,故称后行,即产生回溯;
es5 就支持了先行断言,es2018 才支持后行断言
p(?=pattern)
零宽正向先行断言如正则为p(?=r)
,匹配字符串为'xproxjs xpodsk',那边能够匹配上pr中的p,匹配不上po中的p;换一种方式理解即,p只有在r前面才匹配,必须写成/p(?=r)/
,例如只匹配百分号之前的数字,要写成/\d+(?=%)/
p(?=pattern)
零宽负向先行断言如正则为p(?!r)
,匹配字符串为'xproxjs xpodsk',那边能够匹配上po中的p,匹配不上pr中的p;换一种方式理解即,p只有不在r前面才匹配,必须写成/p(?!r)/
,例如不匹配百分号之前的数字,要写成/\d+(?!%)/
(?<=pattern)p
零宽正向后行断言如正则为(?!x)p
,匹配字符串为'xproxjs ypodsk',那边能够匹配上xp中的p,匹配不上yp中的p;换一种方式理解即,p只有在r后面才匹配,必须写成/(?<=r)p/
,例如只匹配百分号之后的数字,要写成/\(?<=%)d+/
(?<!pattern)p
零宽负向后行断言如正则为(?!x)p
,匹配字符串为'xproxjs ypodsk',那边能够匹配上yp中的p,匹配不上xp中的p;换一种方式理解即,p只有不在r后面才匹配,必须写成/(?<!r)p/
,例如不匹配百分号之后的数字,要写成/\(?<!%)d+/
应用
关于charles中使用rewrite来将测试环境or开发环境的静态资源代理到本地,而接口则不处理,这个时候就需要用到负向先行断言,将api部分排除掉;
所以我们使用负向先行断言,排除掉所有的api请求,这样就可以直接在本地,调试与开发测试|生产环境的功能
匹配url后面的路径
'<img id = "23" style="width:999x;" /><img id = "23" style="width:999x;" />'.replace(
/(?<=(<img[\s\S]*width:\s*))[^("\/);]*/gm,
'100%'
)
"<img id = "23" style="width:100%;" /><img id = "23" style="width:100%;" />"
参考链接
http://es6.ruanyifeng.com/#docs/regex#%E5%90%8E%E8%A1%8C%E6%96%AD%E8%A8%80 https://blog.51cto.com/cnn237111/749047