Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如何从字符串中删除所有单个字符?_Mysql_String_Replace - Fatal编程技术网

MySQL:如何从字符串中删除所有单个字符?

MySQL:如何从字符串中删除所有单个字符?,mysql,string,replace,Mysql,String,Replace,在MySQL中,我需要删除字符串中的所有单个字符: “一只快活的棕色狐狸”->“快活的棕色狐狸” 有什么提示吗?如果您可以在mysql(php、.net、perl)之外处理它,那么您可以使用正则表达式非常轻松地完成这项工作。不幸的是,Mysql的正则表达式引擎只会告诉您是否存在匹配项,而不会告诉您匹配的内容。您希望[[[:]]在Mysql中搜索单词边界。(在其他正则表达式、PERL、grep等中可能是\b) 所以 “[[::]]” 可以找到任何单个字符 好的,试试这个… 这基于上述函数,但硬编码

在MySQL中,我需要删除字符串中的所有单个字符:

“一只快活的棕色狐狸”
->
“快活的棕色狐狸”


有什么提示吗?

如果您可以在mysql(php、.net、perl)之外处理它,那么您可以使用正则表达式非常轻松地完成这项工作。不幸的是,Mysql的正则表达式引擎只会告诉您是否存在匹配项,而不会告诉您匹配的内容。

您希望
[[[:]]
在Mysql中搜索单词边界。(在其他正则表达式、PERL、grep等中可能是
\b

所以

“[[::]]”

可以找到任何单个字符

好的,试试这个…

这基于上述函数,但硬编码以查找单个字符。我并不认为这是一个黑客。但是,如果您需要完成此项工作,并且由于任何原因无法安装外部库,则不会在没有任何单个字符可替换的字符串上减慢速度:

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//
分隔符//
删除函数(如果存在)`删除单个字符`//
创建函数“REMOVE\u SINGLE\u CHARS”(原始varchar(1000))返回varchar(1000)字符集utf8
开始
声明rxChars VARCHAR(20);
声明临时VARCHAR(1000);
声明ch1字符(1);
声明ch2字符(1);
声明ch3字符(1);
声明i INT;
设置rxChars=“[a-zA-Z0-9]”;
设置i=1;
设置温度=”;
如果原始REGEXP CONCAT('[[::]]'),则
loop\u标签:loop
设置ch1=子字符串(原始,i,1);
如果字符长度(原始)>i,则
设置ch2=子串(原始,i+1,1);
如果结束;
如果字符长度(原始)>i+1,则
设置ch3=子串(原始,i+2,1);
如果结束;
如果(i=1),则
如果(ch1不是regexp rxChars或ch2 regexp rxChars),则
设置温度=混凝土(温度,ch1);
如果结束;
如果结束;
如果(ch2=“”),则
#理论上这是多余的,但出于某种原因
#当ch2=''YMMV时,下面的CONCAT(温度,ch2)不工作
设置温度=混凝土(温度,);
其他的
如果(ch2不是regexp rxChars或ch1 regexp rxChars或(i+1CHAR_长度(原始))则
留下环_标签;
如果结束;
设置i=i+1;
端环;
其他的
设置温度=原始温度;
如果结束;
返回温度;
结束//

请参阅以下关于类似主题的讨论:Regex匹配单个字符:
Dylan,很抱歉,您完全正确。您可能需要使用@BillHeller下面解释的单词边界。它不起作用:(天哪,我讨厌正则表达式和不同平台上所有那些愚蠢的差异……MySQL到底为什么不理解普通正则表达式?!好吧,我猜它不起作用是因为函数在字符串上迭代的方式。它正在将字符串拆分,所以我打赌它正在子字符串的末尾找到单词边界。)t不是原始字符串中的实际单词边界。因此,虽然语法不可否认有点奇怪,但我认为该功能适用于正则表达式,是函数实现扼杀了我们。我们只需要找到一种绕过字符串拆分的方法。我会仔细考虑一下。我可以想出可能的修复方法,但它们仍在继续g变得丑陋和缓慢,特别是在长字符串上从上面Derek的原始链接来看,这是一个比尝试使用这种类型的函数来解决它更好的解决方案。你有权访问服务器来安装UDF库吗?好的,如果没有其他功能的话,该函数应该可以完成这项工作。在初始测试时,它似乎不会太慢,但使用时要小心,因为它有点……嗯,让我们说“不太优雅”