MongoDB正则查询需双重转义:JavaScript字符串转义+正则字面量转义;推荐用RegExp构造函数或$eq精确匹配,防注入需过滤元字符而非仅转义斜杠引号。

MongoDB 正则查询里引号和斜杠不转义就报错
直接写 /abc"/ 或 /a/b/ 在 shell 或驱动里大概率解析失败——MongoDB 的正则模式串本质是字符串,斜杠和引号必须按 JavaScript 字符串规则转义,不是正则语法本身的要求。
- Shell 里用
db.col.find({name: {$regex: "a\/b"}}),注意双斜杠:第一个是字符串转义,第二个才是正则里的字面量斜杠 - JSON 格式(如 Compass、某些 HTTP API)里还要多一层:双引号本身就得写成
",所以"a"b"才表示字符串a"b - Node.js 驱动中如果用模板字符串拼接正则,
`a${userInput}b`万一userInput含"或,会直接破坏 JSON 结构,必须先JSON.stringify()包一层
JavaScript 驱动里用 RegExp 构造函数更安全
绕过字符串字面量的双重转义困境,把模式和标志拆开传,让 JS 引擎自己处理原始字符。
- 错误写法:
{name: {$regex: "a"b", $options: "i"}}—— 双引号未转义,JS 解析报错 - 正确写法:
{name: {$regex: new RegExp('a"b', 'i')}},引号在单引号字符串里无需转义 - 动态场景下,用户输入
input = 'a"b/c',直接new RegExp(input, 'g')即可,不用手动替换/或";但要注意input若含$、^等正则元字符,仍需额外转义(用input.replace(/[.*+?^${}()|[]\]/g, '\$&'))
聚合管道中 $regex 的字符串参数同样要双重转义
在 $match 或 $filter 里写正则,和 find 一样受字符串字面量限制,尤其容易在嵌套表达式里漏掉一层。
-
{$regex: "c:\\temp"}表示匹配路径c: emp:四个反斜杠 → 字符串解析为两个 → 正则引擎收到一个字面量反斜杠 - 用
$literal包不住正则特殊字符,它只防止变量插值,不改变字符串转义规则 - Compass 界面里粘贴正则时,右下角提示 “Invalid regular expression” 很可能就是引号或斜杠少了一个反斜杠
真正要小心的是正则注入,不是转义本身
很多人花半天调转义,结果上线后被 userInput = '.*' 搞垮查询性能——转义解决的是语法错误,防注入得靠白名单或元字符过滤。
- 仅对用户输入做
replace(///g, '\/')不够,.、*、^等照样能被当正则用 - 如果只是“精确匹配带引号的字符串”,别用
$regex,改用$eq+ 完整字符串,既快又安全 - 必须用正则时,优先考虑
$regex: { $options: "i" }写法,比字符串形式略易读,但该转的还是得转










