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
,它会工作(即不会引发错误),但不是你想的那样:它会匹配例如分别是CokSoda
、CokeeeeeSoda
和CokeCoda
,因为+
和*
在另一个字符之后,而` before another character all have specific meanings. The linked function prefixes all of those characters with
` 是一个“转义字符”,这消除了它们的特殊含义。这使得Coke\*Soda
、Coke\+Soda
和Coke\\Soda
上面的查询符合您的要求。以上是关于Node.js 为啥 RegExp() 用 \ 抛出错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章