我有一个大约有 500k 行的表; varchar(255) UTF8 列filename
包含文件名;
我试图从文件名中删除各种奇怪的字符 - 我想我会使用字符类:[^a-zA-Z0-9()_ .\-]
Now, MySQL中有没有一个函数可以让你通过正则表达式进行替换?我正在寻找与 REPLACE() 函数类似的功能 - 简化示例如下:
SELECT REPLACE('stackowerflow', 'ower', 'over');
Output: "stackoverflow"
/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-');
Output: "-tackover-low"
我知道关于正则表达式/类似 https://stackoverflow.com/a/6943142/19746,但那些只检查if有一个匹配,没有what比赛是。
(I could do a "SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'
“从 PHP 脚本中执行preg_replace
进而 ”UPDATE foo ... WHERE pkey_id=...
”,但这看起来像是最后的手段,缓慢且丑陋的黑客)
如果您使用MariaDB或MySQL 8.0,它们有一个功能
REGEXP_REPLACE(col, regexp, replace)
See MariaDB 文档 https://mariadb.com/kb/en/mariadb/documentation/functions-and-operators/string-functions/regular-expressions-functions/pcre-regular-expressions/ and PCRE 正则表达式增强 https://mariadb.com/kb/en/mariadb/documentation/functions-and-operators/string-functions/regular-expressions-functions/pcre-regular-expressions/
请注意,您也可以使用正则表达式分组(我发现这非常有用):
SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '\\2 - \\1 - \\3')
returns
over - stack - flow
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)