如何在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,但那些只检查是否有匹配,不匹配什么。
(我可以从PHP脚本中执行“ SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .-]'
”,执行preg_replace
然后“ UPDATE foo ... WHERE pkey_id=...
“,但看起来像是最后一UPDATE foo ... WHERE pkey_id=...
缓慢和丑陋的黑客)
你可以使用MySQL 8.0+本地REGEXP_REPLACE
。
12.5.2正则表达式:
REGEXP_REPLACE(expr,pat,repl [,pos [,occurrence [,match_type]]])
用与替换字符串repl匹配的模式pat指定的正则表达式替换字符串expr中的匹配项,并返回结果字符串。 如果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
DBFiddle演示
没有。
但是,如果您有权访问服务器,则可以使用用户定义的函数(UDF),如mysql-udf-regexp。
编辑: MySQL 8.0+你可以使用本地REGEXP_REPLACE。 上面的答案更多
改用MariaDB。 它有一个功能
REGEXP_REPLACE(col, regexp, replace)
请参阅MariaDB文档和PCRE正则表达式增强
请注意,您也可以使用正则表达式分组(我发现这非常有用):
SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '2 - 1 - 3')
回报
over - stack - flow
链接地址: http://www.djcxy.com/p/76727.html