如何编写正则匹配不以.lean()结尾的await调用语句
正则匹配await调用语句实现方案
需求梳理
- 待匹配目标:标准格式的await调用语句,支持跨行写法,示例如下:
await Listing.find({ Test: 1 });
- 排除规则:所有以
.lean();结尾的await语句不纳入匹配范围,需排除的示例如下:
await Listing.find({ Test: 1 }).lean();
- 原有方案问题:之前编写的正则
(?<=await)([\S\s]*?)(?!.+\.lean())(;)无法达到预期,核心问题有两点:- 负向预查方向错误:
(?!.+\.lean())是校验当前位置后方的内容,而我们需要判断的是分号前方紧邻的内容是否为.lean(),预查逻辑完全反向,根本无法触发排除规则 - 匹配边界模糊:非贪婪匹配规则没有锚定终止位置的校验逻辑,容易出现跨语句误匹配。
- 负向预查方向错误:
可用正则实现
支持ES2018+、Python、Java等主流正则引擎的写法:
(?<=await\s)([\s\S]*?)(?<!\.lean\(\));
规则拆解
(?<=await\s):正向后顾断言,仅匹配前面带await关键字的内容,避免误匹配非await开头的语句([\s\S]*?):非贪婪匹配任意字符(包含换行、空格、特殊符号),覆盖跨行写法的场景(?<!\.lean\(\)):负向后顾断言,校验当前匹配到的分号前面紧邻的内容不是.lean(),精准排除带.lean()结尾的语句;:匹配语句结尾的分号,作为单条语句匹配的终止标识
如果是不支持后顾断言的老旧正则环境,可以用捕获组写法替代,取第一个捕获组的内容即可:
await\s([\s\S]*?)(?<!\.lean\(\));
测试验证:上述正则可以正常匹配不带
.lean()的await调用语句,遇到.lean();结尾的语句会自动跳过,符合需求。
内容的提问来源于stack exchange,提问作者Dev01
相关产品推荐
相关产品推荐

