Вы хотите [[:<:]]
и [[:>:]]
для поиска границ слов в MySQL.(В других регулярных выражениях это будет \b
, PERL, grep и т. Д.)
ОК, ПОПРОБУЙТЕ ЭТО ...
Это основано на функции выше, но жестко запрограммировано для поиска отдельных символов.Я не утверждаю, что это гораздо больше, чем взломать.Но если вам нужно выполнить работу, и вы не можете установить внешние библиотеки по какой-либо причине, это не замедлит работу со строками, которые НЕ имеют каких-либо одиночных символов для замены:
delimiter //
DROP FUNCTION IF EXISTS `REMOVE_SINGLE_CHARS`//
CREATE FUNCTION `REMOVE_SINGLE_CHARS`(original varchar(1000)) RETURNS varchar(1000) CHARSET utf8 DETERMINISTIC
BEGIN
DECLARE rxChars VARCHAR(20);
DECLARE temp VARCHAR(1000);
DECLARE ch1 CHAR(1);
DECLARE ch2 CHAR(1);
DECLARE ch3 CHAR(1);
DECLARE i INT;
SET rxChars = '[a-zA-Z0-9]';
SET i = 1;
SET temp = "";
IF original REGEXP CONCAT('[[:<:]]',rxChars,'[[:>:]]') THEN
loop_label: LOOP
set ch1 = SUBSTRING(original,i,1);
if CHAR_LENGTH(original) > i THEN
set ch2 = SUBSTRING(original,i+1,1);
END IF;
if CHAR_LENGTH(original) > i+1 THEN
set ch3 = SUBSTRING(original,i+2,1);
END IF;
if(i = 1) THEN
IF (ch1 NOT regexp rxChars OR ch2 regexp rxChars) THEN
set temp = CONCAT(temp, ch1);
END IF;
END IF;
IF(ch2 = ' ') THEN
# Theoretically this is redundant, but for some reason the
# CONCAT(temp, ch2) below is not working when ch2 = ' ' YMMV
set temp = CONCAT(temp, ' ');
ELSE
IF(ch2 NOT regexp rxChars OR ch1 regexp rxChars OR (i+1<CHAR_LENGTH(original) AND ch3 regexp rxChars)) THEN
set temp = CONCAT(temp, ch2);
END IF;
END IF;
IF i+2>CHAR_LENGTH(original) THEN
LEAVE loop_label;
END IF;
SET i=i+1;
END LOOP;
ELSE
SET temp = original;
END IF;
RETURN temp;
END//