关于正则表达式的零宽断言(?!、?<!、?=、?<=)

关于正则表达式的零宽断言(?!、?

背景

关于正则表达式,相信大部分开发都有所了解,特别是前端开发,经常会用到正则表达式对表单填写内容进行校验。

那么,现在试想一个这样的场景,假设需要使用正则表达式匹配出所有.js结尾的文件名,但是不能包含.min.js结尾的文件名。
这种情况下改如何实现呢?

这时候就用到了正则表达式的零宽断言了。

首先,先看一个正则表达式

/^(?!.*?_$)(?!_)[A-Za-z0-9_]+$/g

这个正则表达式能够匹配出Abc123、AA__dsas,但是不会匹配出_Adfds_。
重点就在于该正则表达式中用到的一种奇怪的写法?!,没错,这个就是零宽断言的一种了

零宽断言

?!会排除匹配位置右侧匹配到的项

?<!会排除匹配位置左侧匹配到的项

?=会寻找匹配位置右侧包含匹配项的匹配内容

?<=会寻找匹配位置左侧包含匹配项的匹配内容

综上所述,加入想要实现文章一开始的正则表达式,只需要这样写

/(?/g

什么是匹配位置?

其实,想要更加深入的理解零宽断言的匹配逻辑,需要了解一个概念:匹配位置

你可以这样理解,当正则表达式在对一个字符串进行匹配解析的时候,它是一个字符一个宽度的去往右移动匹配位置,
当找到连续的多个符合匹配规则的时候,就会将匹配规则移动多个宽度
(其实就是lastIndex的变化逻辑)

而零宽断言就是在当前匹配位置上进一步对匹配位置的左侧或右侧进行匹配。但是它只进行匹配而不会在匹配后移动匹配位置,
这就相当于它移动了零个宽度
这也是零宽断言名称的由来,相信理解了这一匹配逻辑,你会更加容易掌握零宽断言的使用。

结尾

在这之后,遇到需要判断匹配项的两边,但有不需要两边的匹配内容的时候,可以拿出零宽断言,问题? So Easy!

你可能感兴趣的:(正则表达式,前端开发,正则表达式,javascript,html)