我有这个多行字符串:
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);
?>
目前您正在使用这样的模式,可以进行一些改进:
$regular_expression = '/\n(\n)+(?<namedGroup>([\w\d]+.*(\n)?)+)/m';
您只匹配换行符
\n
,显然您的文件中有\r\n
。要匹配这些,您可以使用 \R
来匹配任何 Unicode 换行符序列。
如果您只想匹配
(?<namedGroup>
的单个值,那么在使用 \K
丢弃迄今为止匹配的内容时,您实际上可以完全忽略该组。
请注意:
[\w\d]
与 \w
相同,也匹配数字/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.*)*