我有一个示例代码,它使用knex raw:
let reg = '\((.*?\)'
const result = await knex.raw(`select *, regexp(code, '${reg}', 1,1,null,1) from test ...`);
和knex查询生成查询。
select *, regexp(code, '((.*?)', 1,1,null,1) from test ...
-> 缺少反斜杠
当我将reg变量改为let reg = '\\((.*?\\)'
时
knex查询生成:
select *, regexp(code, '\\((.*?\\)', 1,1,null,1) from test ...
->双反斜杠
我想要我的knex查询生成查询单反斜杠:
select *, regexp(code, '\((.*?\)', 1,1,null,1) from test ...
请救救我!
发布于 2021-04-07 17:55:45
你所要求的毫无意义。引用MySQL手册
若要在正则表达式中使用特殊字符的文字实例,请在其前面加上两个反斜杠()字符。MySQL解析器解释其中一个反斜杠,正则表达式库解释另一个反斜杠。例如,要匹配包含特殊+字符的字符串1+2,只有以下正则表达式中的最后一个是正确的: mysql>选择REGEXP_LIKE('1+2',‘1+2’),-> 0 mysql>选择REGEXP_LIKE('1+2',‘1+2’),-> 0 mysql>选择REGEXP_LIKE('1+2','1\+2');
所以,双反斜杠是正确的输出,单反斜杠根本不会做任何事情。
但是,您甚至不应该从插入到查询中的带有双反斜杠的字符串文本(而不是使用?
占位符)获得这个输出,所以我假设您误读了输出,它可能是对象的一部分,或者已经被重新编码为JS字符串文本。要获得双反斜杠的正确输出,您需要在字符串文本中使用四重反斜杠,或者使用参数化查询。
此外,您的regexp有不平衡的副项(一个未转义的开括号,但没有结束括号)。
发布于 2021-04-07 17:43:59
尝尝这个
let reg = '\\((.*?\\)'
const result = await knex.raw(`select *, regexp(code, '?', 1,1,null,1) from test ...`, [reg]);
https://stackoverflow.com/questions/66952400
复制相似问题