我尝试了这篇文章的答案Regex. Find paragraph containing some word,在我的情况下,这将是
((?!\n\n).)*(cat)
,但这不起作用。
如何使用PCRE2正则表达式(PHP〉= 7.3)匹配文本中包含单词“cat”的所有段落,其中每个段落由两个连续的换行符分隔(允许一个段落中有一个换行符,但不允许两个)?
例如,如果输入文本如下所示
Paragraph 1 wepfowfpo
fww efwf
Paragraph 2 wefwf32321
!@d r33tcat54, 333!..
Paragraph 3 4t4t022
-`121231ere3r3cat342232
$ 4t0g cat rdwd203
$$333
Paragraph 4 222cocdo3
则期望的输出为
Paragraph 3 4t4t022
-`121231ere3r3cat342232
$ 4t0g cat rdwd203
$$333
我尝试使用类似\n\n.*(?=cat)cat.*\n\n
的东西,但这个匹配只有那些包含“cat”的行。
1条答案
按热度按时间balp4ylt1#
如何splitting字符串到段落和matching那些包含
cat
。请参阅www.example.com上的PHP演示tio.run-word bundary
\b
防止匹配tcat5
。如果您不能使用PHP函数,请遵循
(?m)
multiline 模式的仅regex思想。See this demo at regex101-进一步添加
i
标志到 * 忽略大小写 *(也是match e.g.Cat
)。| 正则表达式|解释|
| --------------|--------------|
|
(?m)
|标记 * 多行模式 * 使^
匹配 * 行开始 *||
^(?:.+\n)*
|在^
开始repeat(?:
non capturing group)
*
* 任意数量 * 次,包含:.+
greedily match one or more chars up to\n
newline -匹配之前行的部分(如果可用,使用atomic group而不是非捕获在这里可以更有效:demo)||
.*?\bcat\b.*
|.*?
* lazy * 匹配\bcat\b
以下的任何字符(使用word bundaries).*
其余部分||
(?:\n.+)*
|匹配段落中.+
阻止跳过\n\n
的所有剩余行|