MariaDB 中的正则表达式替换

Posted

技术标签:

【中文标题】MariaDB 中的正则表达式替换【英文标题】:Regular expression replace in MariaDB 【发布时间】:2021-04-03 01:11:54 【问题描述】:

我正在尝试匹配 SMF 论坛中的内部链接,并将 BBC 标记从 url 转换为 iurl,以便这样的链接:

[url=https://www.translatum.gr/forum/index.php?topic=989144.0]κατ' ἐπιταγήν -> by way of command[/url]

会变成:

[iurl=https://www.translatum.gr/forum/index.php?topic=989144.0]κατ' ἐπιταγήν -> by way of command[/iurl]

我在 PhpMyAdmin 上尝试过类似的操作(使用 MariaDB 10.3)

UPDATE smf_messages SET body = REGEXP_REPLACE(body, '(\[url=https:\/\/www\.translatum\.gr)(.*?)(\[\/url\])', '[iurl=https://www.translatum.gr\\2[/iurl]') WHERE ID_TOPIC = 987873

虽然似乎可以在 test in regex101 上工作,但会在 SQL 上提供垃圾输出(即,它被链接及其文本的多次迭代替换)。我用过this for syntax reference

【问题讨论】:

【参考方案1】:

您需要对字符串文字中的反斜杠进行双重转义,以实际定义形成正则表达式转义的文字反斜杠字符。

另外,您的正则表达式替换太多余了,您可能会捕获更多文本并使替换更短:

REGEXP_REPLACE(body, '\\[(url=https://www\\.translatum\\.gr.*?)\\[/url]', '[i\\1[/iurl]')

见this regex demo。

【讨论】:

哇,太棒了,多次转义让我感到困惑 :) 遗憾的是 regex101 没有 mysql 风格。

以上是关于MariaDB 中的正则表达式替换的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式/Python:当正则表达式已经进行替换时,Python 中的替换

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

php如何正则替换css中的图片路径?

怎样用正则表达式判断字符串中的中文数

C#正则表达式指定替换

Python正则表达式仅根据正则表达式替换段落中的特定行而不是整个文件