我意识到这可能看起来像是一个愚蠢的请求,但无论如何我都要问。
我希望使用正则表达式来查找数字列表中的每个第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'。
答案 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+),
会起作用。