如何在MySQL中执行正则表达式替换?

限于喜欢 提交于 2020-02-28 09:27:14

我有一张约有50万行的表格; varchar(255)UTF8列filename包含一个文件名;

我正在尝试从文件名中去除各种奇怪的字符-以为我会使用字符类: [^a-zA-Z0-9()_ .\\-]

现在, MySQL中是否有一个函数可以让您通过正则表达式进行替换 ? 我正在寻找与REPLACE()函数类似的功能-简化示例如下:

SELECT REPLACE('stackowerflow', 'ower', 'over');

Output: "stackoverflow"

/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-'); 

Output: "-tackover-low"

我知道REGEXP / RLIKE ,但这些只有有一个匹配检查,没有与之匹配的是什么

(我可以从PHP脚本中执行“ SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\\-]' ”,执行preg_replace ,然后“ UPDATE foo ... WHERE pkey_id=... “,但这看起来像是最后手段缓慢而丑陋的骇客)


#1楼

您可以“做到”……但这并不是很明智的选择……这就像我将要尝试的那样大胆……只要RegReg完全支持您使用perl之类的东西就更好了。

UPDATE db.tbl
SET column = 
CASE 
WHEN column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]' 
THEN REPLACE(column,'WORD_TO_REPLACE','REPLACEMENT')
END 
WHERE column REGEXP '[[:<:]]WORD_TO_REPLACE[[:>:]]'

#2楼

我很高兴地报告,由于提出了这个问题,现在有了一个令人满意的答案! 看一下这个很棒的软件包:

https://github.com/mysqludf/lib_mysqludf_preg

示例SQL:

SELECT PREG_REPLACE('/(.*?)(fox)/' , 'dog' , 'the quick brown fox' ) AS demo;

我从此博客文章中找到了与此问题相关的软件包。


#3楼

请改用MariaDB。 具有功能

REGEXP_REPLACE(col, regexp, replace)

请参阅MariaDB文档PCRE正则表达式增强功能

请注意,您也可以使用regexp分组(我发现这非常有用):

SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '\\2 - \\1 - \\3')

退货

over - stack - flow

#4楼

我们可以在SELECT查询中使用IF条件,如下所示:

假设对于任何带有“ ABC”,“ ABC1”,“ ABC2”,“ ABC3”,...的东西,我们要替换为“ ABC”,然后在SELECT查询中使用REGEXP和IF()条件,就可以实现。

句法:

SELECT IF(column_name REGEXP 'ABC[0-9]$','ABC',column_name)
FROM table1 
WHERE column_name LIKE 'ABC%';

例:

SELECT IF('ABC1' REGEXP 'ABC[0-9]$','ABC','ABC1');

#5楼

我们无需使用正则表达式即可解决此问题,此查询仅替换完全匹配的字符串。

update employee set
employee_firstname = 
trim(REPLACE(concat(" ",employee_firstname," "),' jay ',' abc '))

例:

emp_id employee_firstname

1个杰伊

2杰伊·阿杰

3周杰伦

执行查询结果后:

emp_id employee_firstname

1 abc

2 abc阿杰

3 abc

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!