我有一个约有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,但是那些只检查if是否有匹配项,而不是what匹配项。
((我可以从PHP脚本执行“ SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
”,先执行preg_replace
,然后执行“ UPDATE foo ... WHERE pkey_id=...
”,但这看起来像是最后的慢速和丑陋的骇客)]
MySQL 8.0+,您可以直接使用REGEXP_REPLACE
。
REGEXP_REPLACE(expr,pat,repl [,pos [,出现[,match_type]]]]] >>
用替换字符串repl替换字符串expr中与模式pat指定的正则表达式匹配的匹配项,并返回结果字符串。如果expr,pat或repl为NULL,则返回值为NULL。
[以前,MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符(REGEXP,RLIKE)。
使用Unicode国际组件(ICU)重新实现了对正则表达式的支持,该组件提供了完整的Unicode支持并且是多字节安全的。 REGEXP_LIKE()函数以REGEXP和RLIKE运算符的方式执行正则表达式匹配,它们现在是该函数的同义词。 此外,REGEXP_INSTR(),REGEXP_REPLACE()和REGEXP_SUBSTR()函数可用于找到匹配位置并分别执行子串替换和提取。
SELECT REGEXP_REPLACE('Stackoverflow','[A-Zf]','-',1,0,'c'); -- Output: -tackover-low
我们可以在SELECT查询中使用IF条件,如下所示:
下面的那个基本上从左边找到第一个匹配项,然后替换所有匹配项(在mysql-5.6中测试)。
我认为有一个简单的方法可以实现这一目标,并且对我来说很好。
要使用REGEX选择行
编号
改为使用MariaDB。它具有功能
我使用此方法的蛮力方法只是:
我最近编写了一个MySQL函数来使用正则表达式替换字符串。您可以在以下位置找到我的帖子:
我们不使用正则表达式即可解决此问题此查询仅替换完全匹配的字符串。
我很高兴地报告,自从提出此问题以来,现在有了令人满意的答案!看看这个很棒的包:
UPDATE 2:
您可以做到...但是这不是很明智。这就像我将尝试的那样大胆...尽可能多的RegEx完全支持使用perl等工具。