我知道这可能看起来是个愚蠢的请求,但我还是要问一下。
我希望使用正则表达式在数字列表中找到每个第n个逗号。例如:
88574,93243,129659,135504,136357,141052,141619,141619,142195,144622,144946,...
您可以将每4个逗号','替换为',\r\n',这样就可以将数字列表转换为n行4列的网格。
查找所有逗号很简单:
[^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”的正则表达式问题,它应该可以工作。
preg_replace
,因此@Tim的解决方案应该是可行的。 - Alan Moore