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

我有一张约有50万行的表格;varchar(255)UTF8列filename包含一个文件名;

我正在尝试从文件名中删除各种奇怪的字符-以为我会使用字符类: [^a-zA-Z0-9()_ .\-]

现在, ?我正在寻找与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=...”,但看起来像一个不得已的缓慢和丑陋的黑客)

回答:

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

12.5.2正则表达式

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

将字符串 中与模式 指定的正则表达式匹配的匹配项替换为替换字符串 ,并返回结果字符串。如果

, 或 为NULL,则返回值为NULL

和正则表达式支持:

此前, MySQL的 使用的亨利斯宾塞正则表达式库来支持正则表达式运算符(REGEXPRLIKE)。

使用Unicode国际组件(ICU)重新实现了对正则表达式的支持,该组件提供了完整的Unicode支持并且是多字节安全的。该REGEXP_LIKE()函数以REGEXPRLIKE运算符的方式执行正则表达式匹配,它们现在是该函数的同义词。

REGEXP_INSTR()REGEXP_REPLACE()REGEXP_SUBSTR()

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

-- Output:

-tackover-low

DBFiddle演示

以上是 如何在MySQL中执行正则表达式替换? 的全部内容, 来源链接: utcz.com/qa/419681.html

回到顶部