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

时间:2017-05-12 08:52:44

标签: regex string replace

所以我的正则表达式是:

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

我的主题是

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

所以我想得到

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

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

1 个答案:

答案 0 :(得分:2)

两线收缩情景

您可以使用

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

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

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

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

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

请参阅regex demo

<强>详情:

  • \n - 换行符
  • (.*(?:\n|$)) - 第1组捕获除换行符之外的任何0 +字符(.*),包括换行符或字符串结尾($)。

收缩任意行数

您可以使用正则表达式匹配5行like this

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

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

查看PHP demo

$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'