正则表达式:使用限制量词访问嵌套匹配项



所以我的正则表达式是:

((('.*'),(n)){2})

我的主题是

'Welcome',
'to',
'RegExr',
'to',
'sad',

所以我想得到

'Welcome','to',
'RegExr','to',
'sad',

我该怎么做?如果我只是写$2它给了我'to''to''sad',但不是'Welcome''to''RegExr''to''sad' - 首先;第二(我认为最重要的(——我怎样才能访问这些主题{2}每一个?

两行收缩方案

您可以使用

n(.*(?:n|$))

并替换为 $1 .如果在 LF 之前可以有 CR,请使用

r?n(.*(?:r?n|$))

其中r?n匹配可选的 CR abd,然后匹配 LF。请注意,要匹配主要的三种换行符类型,您可以将r?n替换为 (?:rn?|n) 。或者,如果支持R(任何换行符(构造:

R(.*(?:R|$))

查看正则表达式演示

详情

  • n - 换行符
  • (.*(?:n|$)) - 组 1 捕获除换行符 ( .*( 以外的任何 0+ 字符,直到并包括换行符或字符串末尾 ($ (。

缩小任意行数

您可以使用正则表达式来匹配 5 行,如下所示:

'.*',(?:r?n'.*',){4}

然后在匹配评估器/回调函数(方法(中删除所有换行符。

查看 PHP 演示:

$s = "'text 1',n'text 2',n'text 3',n'text 4',n'text 5',n'text 6',n'text 7',n'text 8',n'text 9',n'text 10',n'MORE here'n";
$lines_to_shrink = 5;
echo preg_replace_callback("~'.*',(?:R'.*',){" . ($lines_to_shrink-1) . "}~", function($m) {
    return str_replace(array("n", "r"), "", $m[0]);
}, $s);

输出:

'text 1','text 2','text 3','text 4','text 5',
'text 6','text 7','text 8','text 9','text 10',
'MORE here'

最新更新