小编典典

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

all

我有一张约 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=...”,但这看起来像是最后的手段,缓慢而丑陋的 hack)


阅读 442

收藏
2022-03-08

共1个答案

小编典典

使用 MySQL 8.0+ ,您可以使用本机REGEXP_REPLACE功能。

12.5.2
正则表达式

REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

用替换字符串 repl* 替换字符串 expr 中匹配由模式 pat 指定的正则表达式的匹配项,并返回结果字符串。如果
exprpatrepl 是,则返回值为。
***NULL``NULL

正则表达式支持

以前, MySQL 使用 Henry Spencer 正则表达式库来支持正则表达式运算符 ( REGEXP, RLIKE)。

正则表达式支持已使用 Unicode 国际组件 (ICU) 重新实现,它提供完整的 Unicode
支持并且是多字节安全的。该函数以and运算符REGEXP_LIKE()的方式执行正则表达式匹配,这些运算符现在是该函数的同义词。 此外,*
函数可用于分别查找匹配位置并执行子字符串替换和提取。REGEXP``RLIKE
REGEXP_INSTR() REGEXP_REPLACE() REGEXP_SUBSTR() ***

SELECT REGEXP_REPLACE('Stackoverflow','[A-Zf]','-',1,0,'c'); 
-- Output:
-tackover-low

DBFiddle
演示

2022-03-08