我有一张约 500k 行的表;varchar(255) UTF8 列filename包含一个文件名;
filename
我正在尝试从文件名中删除各种奇怪的字符 - 我想我会使用一个字符类:[^a-zA-Z0-9()_ .\-]
[^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)
SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
preg_replace
UPDATE foo ... WHERE pkey_id=...
使用 MySQL 8.0+ ,您可以使用本机REGEXP_REPLACE功能。
REGEXP_REPLACE
12.5.2 正则表达式:
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]]) 用替换字符串 repl* 替换字符串 expr 中匹配由模式 pat 指定的正则表达式的匹配项,并返回结果字符串。如果 expr 、 pat 或 repl 是,则返回值为。 ***NULL``NULL
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
用替换字符串 repl* 替换字符串 expr 中匹配由模式 pat 指定的正则表达式的匹配项,并返回结果字符串。如果 expr 、 pat 或 repl 是,则返回值为。 ***NULL``NULL
NULL``NULL
和正则表达式支持:
以前, MySQL 使用 Henry Spencer 正则表达式库来支持正则表达式运算符 ( REGEXP, RLIKE)。 正则表达式支持已使用 Unicode 国际组件 (ICU) 重新实现,它提供完整的 Unicode 支持并且是多字节安全的。该函数以and运算符REGEXP_LIKE()的方式执行正则表达式匹配,这些运算符现在是该函数的同义词。 此外,* 、 和 函数可用于分别查找匹配位置并执行子字符串替换和提取。REGEXP``RLIKE REGEXP_INSTR() REGEXP_REPLACE() REGEXP_SUBSTR() ***
以前, MySQL 使用 Henry Spencer 正则表达式库来支持正则表达式运算符 ( REGEXP, RLIKE)。
REGEXP
RLIKE
正则表达式支持已使用 Unicode 国际组件 (ICU) 重新实现,它提供完整的 Unicode 支持并且是多字节安全的。该函数以and运算符REGEXP_LIKE()的方式执行正则表达式匹配,这些运算符现在是该函数的同义词。 此外,* 、 和 函数可用于分别查找匹配位置并执行子字符串替换和提取。REGEXP``RLIKE REGEXP_INSTR() REGEXP_REPLACE() REGEXP_SUBSTR() ***
REGEXP_LIKE()
REGEXP``RLIKE
REGEXP_INSTR()
REGEXP_REPLACE()
REGEXP_SUBSTR()
SELECT REGEXP_REPLACE('Stackoverflow','[A-Zf]','-',1,0,'c'); -- Output: -tackover-low
DBFiddle 演示