为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2019-05-25 15:45:59
如何在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=...”,但这看起来像一个最后的缓慢和丑陋的黑客)
查看完整描述

4 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

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-low

DBFiddle演示


查看完整回答
反对 回复 2019-05-25
?
MM们

TA贡献1886条经验 获得超2个赞

没有。

但是,如果您可以访问您的服务器,则可以使用用户定义的函数(UDF),如mysql-udf-regexp

编辑: MySQL 8.0+你可以原生使用REGEXP_REPLACE。更多回答如上


查看完整回答
反对 回复 2019-05-25
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

我的强力方法让这个工作只是:

  1. 转储表 - mysqldump -u user -p database table > dump.sql

  2. 查找并替换几个模式 - find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;显然,您可以在文件上执行其他perl regeular表达式。

  3. 导入表格 - mysqlimport -u user -p database table < dump.sql

如果要确保字符串不在数据集中的其他位置,请运行一些正则表达式以确保它们都出现在类似的环境中。在运行替换之前创建备份并不困难,以防您意外破坏丢失信息深度的内容。


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 1852 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信