regex 什么是匹配和捕获由未定义数量的新行组成的多行字符串的正则表达式?[PCRE]

xmjla07d  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个多行字符串:

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);
?>

s5a0g9ez

s5a0g9ez1#

目前你正在使用这样的模式,对此可以有一些改进:

$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.*)*


Regex demo|Php demo

相关问题