当前位置: 首页 > 面试题库 >

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

孙佐
2023-03-14
问题内容

我有一张约有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=...”,但看起来像一个不得已的缓慢和丑陋的黑客)


问题答案:

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

12.5.2正则表达式:

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

将字符串 expr 中与模式 pat 指定的正则表达式匹配的匹配项替换为替换字符串 repl ,并返回结果字符串。如果
exprpatreplNULL,则返回值为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演示



 类似资料:
  • 我想以firstName和lastname的形式获得输出。怎么用正则表达式做,有什么想法吗?

  • 问题内容: 我有一个简单的任务,我需要搜索一个以字符串字符和其后的一位数字开头的记录。我正在尝试的是 和 但是两个查询总是返回一条记录 好像我执行以下查询 它返回 这意味着我有以ALA开头的记录,其后是一个数字, 编辑 我正在使用PHP MySQL和innodb引擎来实现它。 问题答案: 我认为您可以使用REGEXP代替LIKE

  • 问题内容: 在MySQL查询中,我如何与Regex.Replace函数具有相同的行为(例如在.NET / C#中)? 我需要这样做是因为,与许多人一样,我想计算一个字段中的单词数。但是,我对以下答案(在该站点上多次给出)不满意: 因为当两个单词之间有一个以上的空格时,它不会给出好的结果。 顺便说一句,我认为Regex.Replace函数可能很有趣,因此欢迎所有好的建议! 问题答案: 有REGEXP

  • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪

  • 问题内容: 我正在尝试以的形式找到网页上的所有链接,或者我做了一个正则表达式,并且可以正常工作: 但是,有没有更短的写方法呢?我重复了:// [^ / \“] + /两次,可能没有必要。我尝试了各种方法,但是没有用。我尝试了: 很明显,我在这里缺少了一些东西,或者我只是对Python正则表达式不够了解。 问题答案: 您正在使用捕获组,并在使用捕获组时改变其行为(它只会返回捕获组的内容)。您的正则表

  • 例如,我有一些数据的列表,这些数据是这种格式的 单词1单词2单词3 word4 word5 word6 word7 word8 word9 但是我想把它们都分开,这样每个单词都在新行中,这样它就会变成这样: 字1 文字2 字3 文字4 字5 字6 文字7 字8 文字9 单词之间的空格是完美的分隔符,可用于搜索 谢谢