mysql - 在 MySQL 中将除一组字符之外的所有字符转换为空格

标签 mysql regex

我有一组定义为有效字符的字符。让我通过以下正则表达式定义有效字符串:

^[a-zA-Z0-9\ .-_]+$

(字母数字、空格、点、破折号和下划线)

问题是,给定一列包含大量无效字符,我如何运行更新以将每个无效字符转换为一个空格?然后可能将后续空格转换为一个空格?

我无法运行多个替换命令,因为有很多可能的无效字符。所以我期待一个正则表达式解决方案。

目前,我正在 Java 中执行该任务(在将表导出为 tsv 格式之后)。但我想要一种 MySQL 方法。

最佳答案

如果您的 MySQL 版本支持,create a function :

DELIMITER $$
CREATE FUNCTION my_func_1 (str TEXT)
  RETURNS TEXT
BEGIN
  DECLARE ret TEXT DEFAULT '';
  DECLARE chr TEXT DEFAULT '';
  DECLARE i INT DEFAULT 1;
  WHILE i < (LENGTH(str) + 1) DO
    SET chr = SUBSTRING(str, i, 1);
    IF chr REGEXP '[-a-zA-Z0-9\\_.]'
      THEN SET ret = CONCAT(ret, chr);
    ELSE
      SET ret = CONCAT(ret, ' ');
    END IF;
    SET i = i + 1;
  END WHILE;
  WHILE ret LIKE '%  %' DO
    SET ret = REPLACE(ret, '  ', ' ');
  END WHILE;
  RETURN TRIM(ret);
END;
$$
DELIMITER ;

测试一下:

SELECT my_func_1('$a-B\\?!=01._%'); > a-B\01._

并使用SET col = my_func_1(col)更新

<小时/>

如果不再需要:

DROP FUNCTION IF EXISTS my_func_1;

此外,我还对您的正则表达式进行了一些更改,因为 - 表示一个范围(如果在类中的字符之间)或者是 .-_ 的意图?然后修改图案。

关于mysql - 在 MySQL 中将除一组字符之外的所有字符转换为空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25778705/

相关文章:

用于覆盖文件路径的 JavaScript 正则表达式

mysql - 内部连接效果不佳

mysql - 如何在此过程中构建动态查询

c# - 使用 MySql.Data.MySqlClient;不管用

php - MySQL- "Unexpected input field parameter in database query."

javascript - 在 Camel 案例转换中让 Camel 开心

java - 为下面的字符串创建正则表达式模式

python - 针对正则表达式的字符串大于小于测试

php - 无法在 laravel 的数据库中保存文件名

javascript - 最小两个单词的正则表达式