MariaDB 中的正则表达式替换

问题描述

我正在尝试匹配 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

解决方法

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

此外,您的正则表达式替换过于冗余,您可能会捕获更多文本并使替换更短:

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

this regex demo

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...