正则表达式匹配

时间:2011-09-12 13:25:37

标签: php mysql regex

我意识到这可能看起来像是一个愚蠢的请求,但无论如何我都要问。

我希望使用正则表达式来查找数字列表中的每个第n个逗号,即:

    88574,93243,129659,135504,136357,141052,141619,141619,142195,144622,144946,...

然后可以每隔4个逗号''取而代之的是',\ r \ n'从而将一个数字列表变成一个4乘n行的网格。

找到所有逗号很简单:

    [^0-9]

从上面的列表中可以找到所有逗号。我现在如何将这些匹配分组以排除每四个中的三个。

我可以用PHP preg_matches来做这个,但我使用的是mysql正则表达式替换函数,所以更喜欢纯正则表达式的答案(如果存在)。

我在MySQL中使用的功能如下:

    DROP FUNCTION IF EXISTS `regex_replace`$$  

    CREATE DEFINER=`root`@`127.0.0.1`   
    FUNCTION `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original TEXT)   
    RETURNS VARCHAR(1000) CHARSET latin1  
        DETERMINISTIC  
    BEGIN  
     DECLARE temp VARCHAR(1000);  
     DECLARE ch VARCHAR(1);  
     DECLARE i INT;  
     SET i = 1;  
     SET temp = '';  
     IF original REGEXP pattern THEN  
     loop_label: LOOP  
       IF i>CHAR_LENGTH(original) THEN  
                 LEAVE loop_label;  
       END IF;  
       SET ch = SUBSTRING(original,i,1);  
         IF NOT ch REGEXP pattern THEN  
            SET temp = CONCAT(temp,ch);  
       ELSE  
          SET temp = CONCAT(temp,replacement);  
                END IF;  
       SET i=i+1;  
              END LOOP;  
     END IF;  
     RETURN temp;  
    END$$  

你可以看到正则表达式的自我不需要处理复杂的匹配。因此,能够选择第n个逗号的正则表达式就足够了。

我希望这能澄清问题。

编辑:

我已将lib_mysqludf_preg库添加到包含preg_replace函数的服务器中。这是一个针对MySQL的PCRE实现,如果我可以回答正则表达式的问题,那么它应该可以用来选择每四分之一的','并替换为',\ r \ n'。

2 个答案:

答案 0 :(得分:4)

$result = preg_replace('/(?:[^,]*,){4}/', '\0\r\n', $subject);

这匹配一行中的四个逗号分隔值(我假设您在组内的字符串中没有逗号),并在它们之后添加一个CRLF。

[编辑] 以上是基于PHP的解决方案

对于纯MySQL解决方案,请安装lib_mysqludf_preg并使用:

    SELECT preg_replace('/(?:[^,]*,){4}/', '${0}\r\n', `fieldname`) as 'new_layout' from `tablename`;

非常感谢所有贡献。

答案 1 :(得分:1)

如果您想匹配每个逗号,那么更直接的模式,也会起作用。

为了匹配每四个逗号,如果MySQL支持look-behind,也许你可以使用(?<=(^|\r\n)(\d+,){3}\d+),。然而,假设每次替换都是在下一场比赛之前进行的。否则也许(?<=^((\d+,){4})*(\d+,){3}\d+),会起作用。