Mongoose正则查询如何精准匹配点号而非正则任意字符通配符
问题根因
你的代码存在两处错误导致点号转义失效:
- 原生
String.replace()方法默认仅替换第一个匹配到的.,若查询参数包含多个点号,后续点号仍会被识别为正则通配符 - JS字符串字面量中单反斜杠属于转义符,你写的
'\.'实际输出结果为.,反斜杠被字符串本身吞掉,没有真正写入正则规则中
修复方案
方法1:全量转义所有正则特殊字符(更安全,推荐)
除了点号外,正则还有*、+、?、[]等多个特殊字符,直接用用户传入的参数构造正则存在逻辑漏洞甚至注入风险,建议先对所有特殊字符做统一转义:
// 正则特殊字符转义工具函数 function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } let { q } = req.query; // 先转义所有正则特殊字符 const escapedQ = escapeRegExp(q); const users = await db.User.find({ email: new RegExp(escapedQ, "ig"), });
方法2:仅修复点号转义的极简方案
如果你确定只需要处理点号的转义,也可以直接修改原来的替换逻辑:
let { q } = req.query; // g代表全局替换所有点号,双反斜杠才能在字符串里保留反斜杠字符 q = q.replace(/\./g, '\\.'); const users = await db.User.find({ email: new RegExp(`${q}`, "ig"), });
修复后,当q传入s.时,构造的正则会变为/s\./ig,即可精准匹配包含s.的邮箱内容。
内容的提问来源于stack exchange,提问作者Ahmed Gaafer
相关产品推荐
相关产品推荐

