我有一组定义为有效字符的字符。让我通过以下正则表达式定义有效字符串:
^ [a-zA-Z0-9 \ .- _] + $
(字母数字,空格,点,短划线和下划线)
问题是,如果给定一个包含大量无效字符的列,我如何运行更新以将每个无效字符转换为一个空格?然后可能将后续空间转换为一个空格?
我无法运行多个替换命令,因为有很多可能的无效字符。所以我期待一个正则表达式解决方案。
目前,我正在用Java完成任务(在将表导出为tsv格式之后)。但我想要一种MySQL方法。
答案 0 :(得分:1)
如果你的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._%');
&gt; a-B\ 01._
并使用SET col = my_func_1(col)
如果不再需要:
DROP FUNCTION IF EXISTS my_func_1;
我还改变了你的正则表达式,因为-
表示一个范围,如果在一个类中的字符之间或者.-_
意图?然后修改模式。