Node.js 为啥 RegExp() 用 \ 抛出错误? [复制]

Posted

技术标签:

【中文标题】Node.js 为啥 RegExp() 用 \\ 抛出错误? [复制]【英文标题】:Node.js Why does RegExp() throw error with \? [duplicate]Node.js 为什么 RegExp() 用 \ 抛出错误? [复制] 【发布时间】:2021-09-24 23:16:29 【问题描述】:

我在后端使用带有猫鼬的 Node.js。对于几个端点,我需要找到具有匹配 item_categories 和匹配 item_name 的项目。但是,当 item_name 为 \ 时,api 会捕获错误并返回错误消息。为什么这会引发错误?我在网上搜索并没有太多解释为什么会发生这种情况。如果 item_name 不是 \ 则一切正常并且 api 返回响应。此外,如果 item_name 是 \ ... 那么它可以工作,但如果它是 ...\ 那么它会失败。

const items = await item.find(item_name:  new RegExp(data.item_name, "i"));
const items = await item.find(item_category: $all:data.item_category, item_name: new RegExp(data.item_name, "i"));

【问题讨论】:

反斜杠是正则表达式中的转义字符。如果它在尾随,那么它就是一个错误,因为没有任何东西被转义。如果它在字符串的其他位置,则 in 表示下一个字符是转义序列 *这可能会改变含义 \n 是换行符,例如,\d 表示数字。 item_name 中可能还有其他特殊字符。 【参考方案1】:

正则表达式中的许多字符都有特殊含义。反斜杠\ 是正则表达式中的转义字符,后面需要另一个字符。如果你只想搜索一个忽略RegExp语义的固定字符串,你需要escape the special characters。

【讨论】:

有什么方法可以搜索带有 \ 或 RegExp() 中的任何特殊字符的项目,还是这些字符只是禁区?例如,item_name 可能类似于十二包可乐或苏打水+可乐。 @Snake 查看答案中的链接。 @Snake 另请参阅:***.com/a/40914826 ***.com/a/35058756 ***.com/a/47439467 我有点困惑那个正则表达式转义函数做了什么,它是用//替换所有这些转义字符还是将字符保留在//?我还检查了 item_name 是否是牙刷/牙刷或牙刷或可乐苏打水,它是否正常工作。 如果你检查Coke*Soda,或Coke+Soda,或Coke\Soda,它会工作(即不会引发错误),但不是你想的那样:它会匹配例如分别是CokSodaCokeeeeeSodaCokeCoda,因为+* 在另一个字符之后,而` before another character all have specific meanings. The linked function prefixes all of those characters with ` 是一个“转义字符”,这消除了它们的特殊含义。这使得Coke\*SodaCoke\+SodaCoke\\Soda 上面的查询符合您的要求。

以上是关于Node.js 为啥 RegExp() 用 \ 抛出错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 随机抛出写 EIO 异常

为啥使用同步功能 node.js

重新抛出非 MySQL 错误 Node.js

node.js中为啥请求favicon.ico

Node.js 服务器随机抛出 EAI_AGAIN

处理 node.js 中 require() 模块抛出的错误