我在Ubuntu 18.04中使用MySQL 8.0 Workbench和MySQL 8.0.16。
我有一个查询,其中需要使用REPLACE
来准备一个表达式,然后使用REGEXP
将结果表达式与某些数据进行匹配。
问题是我不知道如何准备REPLACE
中的特殊字符?我应该使用\\
还是\\\\
??
REGEXP
的官方MySQL manual表示:
在常规中使用特殊字符的文字实例 表达式,其前面有两个反斜杠()字符。 MySQL的 解析器解释反斜杠之一,以及正则表达式 库解释另一个。
示例:
我需要匹配1+2
。因此,我在WHERE
语句中写了这个条件:
WHERE REGEXP '1\\+2'
但是,我的实际情况要求我从列中查询一些数据,并使用REPLACE
来构建REGEXP
表达式。
但是问题是:
当我在select语句中显示REPLACE
函数的结果时,我只看到一个反斜杠,如下所示:1\+2
,尽管我用双反斜杠\\
代替了它。如果在\\\\
内使用四个反斜杠REPLACE
,则REPLACE
输出将显示两个反斜杠1\\+2
,这似乎是我需要在REGEXP
语句中使用的正确表达。但是事实并非如此!
奇怪的是,我进行了包含REGEXP
和REPLACE
的完整查询,其中REGEXP
以REPLACE
的结果作为表达式,查询使用双反斜杠\\
中的REPLACE
和\\\\
中的四个反斜杠REPLACE
都不起作用,尽管根据我从REPLACE
看到的情况,使用四个反斜杠是正确的输出。
为澄清起见,我举了一个小例子对其进行解释:
表格:
CREATE TABLE `test` (
`name` varchar(50) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
使用此数据:
# name, regex
====================
'2', '1\\+2'
然后我进行以下查询:
SELECT `test`.`name`, REPLACE('1\\+{n}','{n}',`test`.`name`) as 'regex'
FROM `transparency_5_regions_top250k`.`test`
WHERE '1+2' REGEXP REPLACE('1\\+{n}','{n}',`test`.`name`);
我在select语句中看到的REPLACE的结果显示一个反斜杠:1\+2
但是,REGEXP
似乎正确地解释了由REPLACE
产生的字符串。
如果我用四个反斜杠进行此查询,尽管我希望它与1+2
相匹配,但找不到任何匹配项:
SELECT `test`.`name`, REPLACE('1\\\\+{n}','{n}',`test`.`name`) as 'regex'
FROM `transparency_5_regions_top250k`.`test`
WHERE '1+2' REGEXP REPLACE('1\\\\+{n}','{n}',`test`.`name`);
如果我用四个反斜杠查询REPLACE输出,则会看到以下字符串:
1\\+2
如果与REGEXP'1 \ +2'一起使用,应该与我的数据'1 + 2'相匹配,但是不匹配!
请,你能告诉我吗。在上述情况下,应如何将诸如+
之类的特殊字符表示为文字字符?
我应该在\\
内使用双\\\\
或REPLACE
以便REGEX
得到正确的表达吗?