在MYSQL中使用正则表达式来递增字符串的一部分?

26 浏览
0 Comments

在MYSQL中使用正则表达式来递增字符串的一部分?

我有一个包含约500k行的表;varchar(255) UTF8列filename包含一个文件名;

我想要从文件名中去除各种奇怪的字符 - 所以我打算使用一个字符类:[^a-zA-Z0-9()_ .\-]

现在,MySQL中是否有一个函数可以通过正则表达式进行替换?我正在寻找类似于REPLACE()函数的功能 - 下面是一个简化的例子:

SELECT REPLACE('stackowerflow', 'ower', 'over');
输出:"stackoverflow"
/* 是否有类似的函数存在? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-'); 
输出:"-tackover-low"

我知道关于REGEXP/RLIKE,但它们只检查是否存在匹配项,而不是匹配项是什么。

(我可以从一个PHP脚本中执行"SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]'",进行preg_replace,然后执行"UPDATE foo ... WHERE pkey_id=...",但这看起来像是一种最后的慢且丑陋的解决方法)

0
0 Comments

使用正则表达式在MYSQL中递增字符串的一部分?

在MySQL 8.0+中,可以使用本地的REGEXP_REPLACE函数来实现。

对于旧版本的MySQL,可以使用用户定义的函数(UDF)来实现,比如mysql-udf-regexp。

REGEXP_REPLACE作为用户定义的函数?听起来很有希望,我会研究一下。谢谢!

MySQL本身并不支持带有多字节字符的正则表达式功能。

很可惜,mysql-udf-regexp似乎不支持多字节字符。regexp_replace('äöõü', 'ä', '')返回的是一个长数字字符串,而不是实际的文本。

真的吗?那个东西听起来像是一个安全漏洞,因为那个"长数字字符串"看起来像是某种缓冲区溢出。

嗯,这是一年前的事情了,但是我当时几乎可以确定我正确地找到了问题所在。我不知道他们是否取得了任何进展,因为我自从那以后就没有再碰过这个工具了。

Windows用户:这里链接的UDF库似乎对Windows的支持不太好。我尝试了链接中提到的Windows安装方法,但效果不佳。

你应该尝试下面的lib_mysqludf_preg库,因为它非常好用。这是一个详细版,因为默认返回一个blob,而我不知道你是否使用的是多字节字符集:select cast( T.R as char) COLLATE utf8_unicode_ci from (select preg_replace('/ä/', '', 'öõüä') R ) T

原生的REGEXP_REPLACE函数是否允许反向引用?

很好,谢谢!我也意识到UDF是一个真正的选择。

0
0 Comments

使用正则表达式在MYSQL中递增字符串的一部分?

出现的原因:

在MYSQL中,如果我们想要使用正则表达式来递增字符串的一部分,通常情况下是没有直接的函数或方法可以实现的。这可能会导致在处理字符串时遇到一些困难,无法快速有效地完成任务。

解决方法:

然而,如果我们正在使用MariaDB或MySQL 8.0,它们提供了一个函数REGEXP_REPLACE(col, regexp, replace),可以方便地实现使用正则表达式递增字符串的一部分。这个函数可以在字符串中匹配正则表达式,并将匹配的部分替换为指定的内容。

使用示例:

例如,我们可以使用REGEXP_REPLACE函数来交换字符串中的两个部分。假设我们有一个字符串"stackoverflow",我们想要交换"stack"和"over"这两个部分。我们可以使用以下代码实现:

SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '\\2 - \\1 - \\3')

这将返回"over - stack - flow",这是从MariaDB 10开始引入的功能。

此外,如果我们想要一次性更改整个列中的字符串,我们可以使用UPDATE语句和REGEXP_REPLACE函数来实现。例如,以下代码将从整个列中删除"-2":

UPDATE table SET Name = REGEXP_REPLACE(Name, "-2$", "\\1")

这将一次性更改整个列中的所有匹配项。

另外,如果我们想要将整个列中的特定部分替换为指定的内容,我们可以使用类似的UPDATE语句和REGEXP_REPLACE函数。例如,以下代码将整个列中的"s:[1-9]"替换为"s:5":

UPDATE table SET file_source = REGEXP_REPLACE(file_source, "s:[1-9]", "s:5")

然而,需要注意的是,如果我们已经在生产环境中部署了数据库,更改整个平台并不是一个现实的解决方案。幸运的是,MariaDB可以作为MySQL的替代品,可以无缝替换,因此我们可以选择使用MariaDB来实现对正则表达式的完全支持。另外,MySQL 8.0也支持类似的功能。

通过使用正则表达式和REGEXP_REPLACE函数,我们可以在MYSQL中实现递增字符串的一部分。这提供了一种简单且有效的方法来处理字符串,并进行复杂的模式匹配和替换。无论是在单个字符串中还是在整个列中,REGEXP_REPLACE函数都可以帮助我们快速地实现所需的功能。如果我们需要这种功能,选择使用MariaDB或MySQL 8.0可能是一个明智的选择。

0