匹配并捕获前面有未定义数量的新行的多行字符串的正则表达式是什么? [PCRE]

问题描述 投票:0回答:1

我有这个多行字符串:

Lorem ipsum dolor sit amet.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus
dictum, lorem et fringilla congue, velit libero sagittis eros, id
lobortis nisi risus ac mauris.

我想使用 PHP 兼容正则表达式来“命名捕获”第二个“段落”(新行之后的 3 行文本)。

我在 regex101 上尝试了以下正则表达式,效果很好:

/\n(\n)+(?<namedGroup>([\w\d]+.*(\n)?)+)/m

但是当我使用以下代码在 PHP 中尝试时,没有捕获到任何内容:

<?php
$text = file_get_contents("paragraphs.txt");

$regular_expression = '/\n(\n)+(?<namedGroup>([\w\d]+.*(\n)?)+)/m';

preg_match($regular_expression, $text, $result);
print_r($result);
?>
php regex regex-group
1个回答
0
投票

目前您正在使用这样的模式,可以进行一些改进:

$regular_expression = '/\n(\n)+(?<namedGroup>([\w\d]+.*(\n)?)+)/m';

您只匹配换行符

\n
,显然您的文件中有
\r\n
。要匹配这些,您可以使用
\R
来匹配任何 Unicode 换行符序列。

如果您只想匹配

(?<namedGroup>
的单个值,那么在使用
\K
丢弃迄今为止匹配的内容时,您实际上可以完全忽略该组。

请注意:

  • [\w\d]
    \w
    相同,也匹配数字
  • 您的模式总共有 4 个捕获组,其中只有指定的捕获组就足够了
  • 您不需要
    /m
    多行标志,因为模式中没有锚点
  • 该模式仅匹配以单词字符开头的行
    \w
  • 与感兴趣的匹配无关,但重复这样的捕获组
    (\n)+
    仅捕获最后一次迭代的值

可用于单场比赛的更新模式:

\R{2,}\K\w.*(?:\R\w.*)*
  • \R{2,}
    匹配 2 个或更多 Unicode 换行序列
  • \K
    忘记到目前为止匹配了什么
  • \w.*
    匹配单词字符和该行的其余部分
  • (?:\R\w.*)*
    可选择重复 Unicode 换行序列、单词字符和该行的其余部分

或仅匹配以非空白字符开头的行

\S

\R{2,}\K\S.*(?:\R\S.*)*

正则表达式演示 | Php 演示

© www.soinside.com 2019 - 2024. All rights reserved.