开发者社区> 问答> 正文

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

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

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

展开
收起
保持可爱mmm 2020-05-08 10:28:09 739 0
1 条回答
写回答
取消 提交回答
  • 使用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的使用的亨利斯宾塞正则表达式库来支持正则表达式运算符(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 来源:stack overflow

    2020-05-08 10:28:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像