我有一组定义为有效字符的字符。让我通过以下正则表达式定义有效字符串:
^[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/