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

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

我有一张约500k行的桌子; 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,但那些只检查是否有匹配,没有什么比赛是。


(我可以SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'从PHP脚本做一个“ ”,做一个preg_replace然后“ UPDATE foo ... WHERE pkey_id=...”,但这看起来像一个最后的缓慢和丑陋的黑客)


SMILET
浏览 1942回答 4
4回答

慕村225694

MySQL 8.0+你可以原生使用REGEXP_REPLACE。12.5.2正则表达式:REGEXP_REPLACE(expr,pat,repl [,pos [,occurrence [,match_type]]])将字符串expr中与模式pat指定的正则表达式匹配的匹配项替换为替换字符串repl,并返回结果字符串。如果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-lowDBFiddle演示

MM们

没有。但是,如果您可以访问您的服务器,则可以使用用户定义的函数(UDF),如mysql-udf-regexp。编辑: MySQL 8.0+你可以原生使用REGEXP_REPLACE。更多回答如上

慕姐4208626

我的强力方法让这个工作只是:转储表 -&nbsp;mysqldump -u user -p database table > dump.sql查找并替换几个模式 -&nbsp;find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;显然,您可以在文件上执行其他perl regeular表达式。导入表格 -&nbsp;mysqlimport -u user -p database table < dump.sql如果要确保字符串不在数据集中的其他位置,请运行一些正则表达式以确保它们都出现在类似的环境中。在运行替换之前创建备份并不困难,以防您意外破坏丢失信息深度的内容。
打开App,查看更多内容
随时随地看视频慕课网APP