Php 改进工作正则表达式以匹配多行
我正在尝试匹配来自旧DOS转储的用户,以便将他们迁移到新的位置。它们以%开头,以“]结尾。一些在一条线上,另一些在多条线上 我的正则表达式%[^\%]*]可以工作,但是有没有更好的方法来选择从%开始到]的每个用户,包括%和],以便我可以将它们放入preg_replace并在以后操作它们 我对多行部分有点怀疑 预期产量 原始数据Php 改进工作正则表达式以匹配多行,php,regex,Php,Regex,我正在尝试匹配来自旧DOS转储的用户,以便将他们迁移到新的位置。它们以%开头,以“]结尾。一些在一条线上,另一些在多条线上 我的正则表达式%[^\%]*]可以工作,但是有没有更好的方法来选择从%开始到]的每个用户,包括%和],以便我可以将它们放入preg_replace并在以后操作它们 我对多行部分有点怀疑 预期产量 原始数据 您可以使用此正则表达式进行搜索: ((?:^%|(?!\A)\G).*)\R(?=[^][]*]) 并将其替换为: $1 PHP代码: 正则表达式详细信息: :启动捕
您可以使用此正则表达式进行搜索:
((?:^%|(?!\A)\G).*)\R(?=[^][]*])
并将其替换为:
$1
PHP代码:
正则表达式详细信息:
:启动捕获组1
?:^%|?!\A\G:在行开始处匹配%或从上一个匹配结束处重新启动匹配\G在前一个匹配的末尾或第一个匹配的字符串的开头断言位置。
*:将所有内容匹配在同一行中
:结束捕获组1
\R:匹配任何类型的换行符
?=[^][]*]:确保我们前面有一个]而中间没有匹配的[或]。
作为regex的替代方法,这只是使用[1]分割数据。然后修剪每一行并使用PHP_EOL用空格替换新行
$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
$data = str_replace(PHP_EOL, " ", trim($data)."]");
});
另一种选择是使用一种模式的变体,您尝试使用一个否定字符类来匹配%并从开始[直到结束] 然后根据匹配删除换行符
^%[^][]*\[[^][]*]$
解释
^字符串开头
%[^][]*匹配除[或]以外的任何字符的%和0+倍
\[[^][]*]匹配从[到结束]
$Assert字符串结尾
|
比如说
两个小的观察结果。。。在正则表达式演示中,]似乎不匹配,%用户:113根本不匹配。。。这正常吗?这两种行为都是需要的。1. ] 不应匹配,因为我们之前删除了换行符]。2%用户:113不匹配,因为它已经在一行中。确定。我觉得有些不对劲。
$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);
$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
$data = str_replace(PHP_EOL, " ", trim($data)."]");
});
^%[^][]*\[[^][]*]$
$result = preg_replace_callback("/^%[^][]*\[[^][]*]$/m", function($m) {
return str_replace(PHP_EOL, "", $m[0]);
}, $data);