将REGEXP与包含特殊字符的REPLACE一起使用

时间:2019-07-31 16:08:25

标签: mysql sql regex replace mysql-workbench

我在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语句中使用的正确表达。但是事实并非如此!

奇怪的是,我进行了包含REGEXPREPLACE的完整查询,其中REGEXPREPLACE的结果作为表达式,查询使用双反斜杠\\中的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得到正确的表达吗?

0 个答案:

没有答案