正则表达式 - 断言

283 阅读1分钟

1. 非捕获组

顾名思义,非捕获组只进行分组,并不会将匹配的内容捕获到组里。

形式:(?:Expression)

举例:
校验手机号,天然就符合非捕获组的使用场景
^(?:13[0-9])|(?:14[14-9])|
(?:15[0-35-9])|(?:16[25-7])|
(?:17[0-35-8])|(?:18[0-9])|
(?:19[18-9])
\d{8}$
总结:
只要不是捕获内容,都可以直接使用非捕获组,节省内存提高效率。
当然,捕获组也可以覆盖非捕获组的使用场景,代价是微不足道的内存消耗。具体使用哪个,不置可否

2. 先行断言

先行断言,匹配 x 仅当后面跟着 y

形式:x(?=y)
举例:
查找整数部分。下面正则的意思是查找.前面的所有数字
/-?\d*(?=.)?/

3. 后行断言

后行断言,匹配 x 仅当前面是 y

形式:(?<=y)x
举例:
查找小数部分。下面正则的意思是查找.后面的所有数字
/(?<=\.)\d*/

4. 正向否定查找

正向否定查找,仅当 x 后面不跟着 y 时匹配 x

形式:x(?!y)
举例:
查找没有 ing 形式的单词
/\b\w(?!ing)\b/g

查找文件名
/[^\/]+(?!.*\/)/.exec("https://fc.flywen.top/hik/nginx.zip");    // nginx.zip

5. 反向否定查找

反向否定查找,仅当 x 前面不是 y 时匹配 x

形式:(?<!y)x
举例:
查找前面不是 un 的字母
//

综上的 5 中断言,其实都可以使用捕获组来实现,无非效率和写法麻烦与否

参考

developer.mozilla.org/zh-cn/docs/…