微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 knex raw 中使用反斜杠

如何解决在 knex raw 中使用反斜杠

我有一个使用 knex raw 的示例代码

let reg = '\((.*?\)'
const result = await knex.raw(`select *,regexp(code,'${reg}',1,null,1) from test ...`);

和 knex 查询生成查询

select *,'((.*?)',1) from test ...

-> 缺少反斜杠

当我将 reg 变量更改为 let reg = '\\((.*?\\)'

knex 查询生成

select *,'\\((.*?\\)',1) from test ...

-> 双反斜杠

我希望我的 knex 查询生成查询单反斜杠:

select *,'\((.*?\)',1) from test ...

请帮帮我!

解决方法

你的要求没有意义。引用 MySQL manual

要在正则表达式中使用特殊字符的文字实例,请在它前面加上两个反斜杠 (\) 字符。 MySQL 解析器解释其中一个反斜杠,正则表达式库解释另一个。例如,要匹配包含特殊 + 字符的字符串 1+2,只有以下正则表达式中的最后一个是正确的:

mysql> SELECT REGEXP_LIKE('1+2','1+2');                       -> 0
mysql> SELECT REGEXP_LIKE('1+2','1\+2');                      -> 0
mysql> SELECT REGEXP_LIKE('1+2','1\\+2');

所以,双反斜杠正确的输出,单反斜杠根本不会做任何事情。

但是,您甚至不应该从带有双反斜杠插入到查询中的字符串文字中获得此输出(不使用 ? 占位符),所以我假设您误读了输出,它可能是对象的一部分,或者已经再次编码为 JS 字符串文字。要获得双反斜杠的正确输出,您需要在字符串文字中使用四重反斜杠或使用参数化查询。

此外,您的正则表达式有不平衡的括号(一个未转义的左括号但没有右括号)。

,

试试这个

let reg = '\\((.*?\\)'
const result = await knex.raw(`select *,regexp(code,'?',1,null,1) from test ...`,[reg]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。