【问题标题】:Mysql , spaces in REGEXPMysql , REGEXP 中的空格
【发布时间】:2013-09-26 17:46:11
【问题描述】:

我有问题。

我的这个函数只做我想做的一件事,它还从字符串中删除了空格,这是我不想要的。

我从这里尝试了所有不同的提示和想法,但它不起作用。文档说我使用正确,也许我误解了。有人可以帮帮我吗?

CREATE DEFINER=`user`@`%` FUNCTION `fn_RemoveNumbers`(str varchar(8000)) RETURNS varchar(767) CHARSET latin1
BEGIN
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret varchar(767) DEFAULT ''; 
  DECLARE c CHAR(1); 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF (c REGEXP '[[:alpha:]]') OR (c REGEXP '[[:space:]]') THEN 
        SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
    END; 
  UNTIL i > len END REPEAT; 
  RETURN ret; 
END

在我看来, (c REGEXP '[[:space:]]') 应该将 char 附加到最终字符串,但它没有。

我也尝试过 ' '、'[ ]' 等,但没有成功。

我正在使用 mysql 5.6 版。我使用了这个文档:http://dev.mysql.com/doc/refman/5.6/en/regexp.html

【问题讨论】:

    标签: mysql regex function


    【解决方案1】:

    我无法在此处测试 UDF,但尝试将其设为 1 正则表达式,如下所示:

    IF c REGEXP '[[:alpha:]]|[[:space:]]' THEN
    

    您是否有可能处理非标准空间?像非换行空间?在这种情况下,也许这可以捕获所有空白:

    IF c REGEXP '[[:alpha:]]|[[:blank:]]' THEN
    

    或者如果你只是想删除数字,像这样:

    IF c NOT REGEXP '[[:digit:]]' THEN
    

    【讨论】:

    • 感谢朋友的回答。尝试了所有方法,甚至 NOT REGEXP '[[:digit:]]' 都不起作用,当我阅读时我确信这是解决方案。我现在也尝试了 c REGEXP '[[:digit:]]' = 0 但仍然不会将空格附加到字符串中。似乎有一个愚蠢的问题:)
    • 这真的很奇怪。我唯一的解释是它不是正则表达式。也许是一个自动修剪变量的 MySQL 设置?因此,您在 ret 中添加一个空格,然后某个进程会出现 “哦!这个 var 末尾的空格,最好把它剪掉!”.
    • 现在找到解决方案了!
    • 感谢您的帮助!
    【解决方案2】:

    我在此页面上找到了解决方案:MySQL REGEXP - Removing white space and non-numeric characters

    CREATE DEFINER=`user`@`localhost` FUNCTION `fn_RemoveNumerics`(str VARCHAR(1000)) RETURNS varchar(1000) CHARSET latin1
    BEGIN
      DECLARE counter INT DEFAULT 0;
      DECLARE strLength INT DEFAULT 0;
      DECLARE strChar VARCHAR(1000) DEFAULT '' ;
      DECLARE retVal VARCHAR(1000) DEFAULT '';
    
      SET strLength = LENGTH(str);
    
      WHILE strLength > 0 DO
        SET counter = counter+1;
        SET strChar = SUBSTRING(str,counter,1);
        IF strChar REGEXP('[0-9]+') = 0
          THEN SET retVal = CONCAT(retVal,strChar);
        END IF;
        SET strLength = strLength -1;
        SET strChar = NULL;
      END WHILE;
    RETURN retVal;
    END
    

    我只是将 'IF strChar REGEXP('[0-9]+') = 1' 更改为 'IF strChar REGEXP('[0-9]+') = 0'

    我仍然无法弄清楚为什么它不起作用。也许它与中继器有关?这个人用了一段时间来得到这份工作 don3e .....而且它的工作原理!

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2011-10-25
      • 2020-11-15
      相关资源
      最近更新 更多