我有一个多行字符串:
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);
?>
型
1条答案
按热度按时间s5a0g9ez1#
目前你正在使用这样的模式,对此可以有一些改进:
字符串
你只匹配了一个新行
\n
,显然你的文件中有\r\n
。要匹配这些,你可以使用\R
来匹配任何Unicode新行序列。如果只想匹配
(?<namedGroup>
的一个值,那么在使用\K
丢弃到目前为止匹配的值时,实际上可以忽略该组。请注意:
[\w\d]
与\w
相同,因为它也匹配数字/m
多行标志,因为模式中没有锚点\w
开头的行(\n)+
只捕获最后一次迭代的值您可以用于单个匹配的更新模式:
型
\R{2,}
匹配2个或更多Unicode换行符序列\K
忘记到目前为止匹配的内容\w.*
匹配一个单词字符和该行的其余部分(?:\R\w.*)*
可选重复Unicode换行符序列、单词字符和行的其余部分或者只匹配以非空白字符
\S
开头的行型
Regex demo|Php demo的