regex 如何使用正则表达式匹配包含特定单词的段落?

ymzxtsji  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(183)

我尝试了这篇文章的答案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”的行。

balp4ylt

balp4ylt1#

如何splitting字符串到段落和matching那些包含cat

preg_grep('/\bcat\b/i', explode("\n\n", $str));

请参阅www.example.com上的PHP演示tio.run-word bundary\b防止匹配tcat5
如果您不能使用PHP函数,请遵循(?m)multiline 模式的仅regex思想。

^(?:.+\n)*.*?\bcat\b.*(?:\n.+)*

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的所有剩余行|

相关问题