您是否知道在Mysql中从varchar变量中删除(或替换)所有非字母数字字符的简单方法?
类似String的替换所有(“[^ a-zA-Z0-9]”,“我”)在Java中('我'是我的特殊字符,但“”也会很好)
答案 0 :(得分:1)
根据RegexBuddy的文档,似乎MySQL没有提供此功能(与PostgreSQL不同):
MySQL对正则表达式的支持相当有限,但仍然非常有用。 MySQL只有一个允许你使用正则表达式的运算符。这是REGEXP运算符,它的工作方式与LIKE运算符类似,只是它不使用_和%通配符,而是使用POSIX扩展正则表达式(ERE)。
答案 1 :(得分:1)
我将为每个字符串使用这样的东西(我用'O'替换每个坏字符):
CREATE FUNCTION removeNonAlphaNum (p_zthes VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
DECLARE v_i INTEGER;
DECLARE v_char VARCHAR(1);
DECLARE v_res VARCHAR(255);
SET v_i := LENGTH(p_zthes);
SET v_res:=p_zthes;
WHILE v_i > 0 DO
SET v_char := SUBSTRING(p_zthes, v_i, 1);
IF (SELECT v_char REGEXP '[^a-zA-Z0-9]') THEN
SET v_res := REPLACE(v_res, v_char, 'O');
END IF;
SET v_i := v_i - 1;
END WHILE;
return v_res;
END
但是我想我可以避免这样的怪物(在字符串中迭代字符并检查每个字符串正则表达式...... bleeeeee ...): - /我仍然需要测试它。
有没有更性感的解决方案?
答案 2 :(得分:0)
这是sql server中的解决方案。但是这个概念就像我创建了一个数字表并分离了字符,然后将它们与正则表达式进行匹配。
希望可以在mysql中描绘相同的概念,稍微改变一下,希望你能做到。
declare @str varchar(50)
set @str = '1ab3^45)(*%'
declare @NumberTable table(id int)
insert into @NumberTable(id) values(1)
insert into @NumberTable(id) values(2)
insert into @NumberTable(id) values(3)
insert into @NumberTable(id) values(4)
insert into @NumberTable(id) values(5)
insert into @NumberTable(id) values(6)
insert into @NumberTable(id) values(7)
insert into @NumberTable(id) values(8)
insert into @NumberTable(id) values(9)
insert into @NumberTable(id) values(10)
insert into @NumberTable(id) values(11)
insert into @NumberTable(id) values(12)
select NonAlphaChars = SUBSTRING(@str,id,1) from @NumberTable
where SUBSTRING(@str,id,1) like '%[^a-z0-9]'
<强> NonAlphaChars 强>
^
)
(
*
%
答案 3 :(得分:0)
对于MSSQL,我提交了类似的内容:
CREATE FUNCTION removeNonAlphaNum(@p_zthes VARCHAR(255))
RETURNS varchar(255)
AS
BEGIN
DECLARE @v_bad_char_index INT;
DECLARE @v_bad_char VARCHAR(1);
DECLARE @v_res VARCHAR(255);
SET @v_res = @p_zthes;
SET @v_bad_char_index = patindex('%[^a-zA-Z0-9]%', @p_zthes)
WHILE (@v_bad_char_index > 0)
BEGIN
SET @v_bad_char = SUBSTRING(@p_zthes, @v_bad_char_index, 1);
SET @v_res = REPLACE(@v_res, @v_bad_char, 'O');
SET @v_bad_char_index = patindex('%[^a-zA-Z0-9]%', @v_res )
END
return @v_res;
END
(但我是一个糟糕的SQL程序员,所以可能存在一些更好的解决方案)
答案 4 :(得分:0)
从MySQL 8.0开始,您可以使用正则表达式从变量中删除非字母数字字符。有方法REGEXP_REPLACE
SELECT REGEXP_REPLACE(@variable, '[^0-9a-zA-Z ]', '')
或
SET @variable = REGEXP_REPLACE(@variable, '[^0-9a-zA-Z ]', '')