问题描述
let reg = '\((.*?\)'
const result = await knex.raw(`select *,regexp(code,'${reg}',1,null,1) from test ...`);
select *,'((.*?)',1) from test ...
-> 缺少反斜杠
当我将 reg 变量更改为
let reg = '\\((.*?\\)'
select *,'\\((.*?\\)',1) from test ...
-> 双反斜杠
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]);