提问人:Paiku Han 提问时间:11/5/2023 最后编辑:InSyncPaiku Han 更新时间:11/5/2023 访问量:64
什么是匹配和捕获以未定义数量的新行为前提的多行字符串的正则表达式?[PCRE系列]
What is any regular expression that matches and capture a multiline string predeced by an undefined number of new lines? [PCRE]
问:
我有这个多行字符串:
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赞
The fourth bird
11/5/2023
#1
目前,您正在使用这样的模式,为此可以进行一些改进:
$regular_expression = '/\n(\n)+(?<namedGroup>([\w\d]+.*(\n)?)+)/m';
您只匹配换行符,显然您的文件中有换行符。要匹配这些,您可以使用这些换行符来匹配任何 Unicode 换行符序列。\n
\r\n
\R
如果您只想匹配单个值,则实际上可以在使用丢弃到目前为止匹配的内容时完全省略该组。(?<namedGroup>
\K
请注意:
[\w\d]
与 as 也匹配数字相同\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.*)*
评论
1赞
Paiku Han
11/5/2023
好的,现在我明白了什么是用的。我在修补我的正则表达式时弄清楚了什么是用的。\K
\R
评论
/m
[\w\d]+
\w+
\r
$text = str_replace("\r", "", $text);
$regular_expression = '/\R{2}\K\w.*(?:\R\w.*)*/';