什么是正则表达式来查找两边都有空格的三个星号:“***”?

What is a regex expression to find three asterisks with whitespace on either side: " *** "?

我的目标是使用正则表达式从 Project Gutenberg UTF-8 编码的文本文件中丢弃页眉和页脚信息。

每本书包含一个 'start line' 像这样:

[...]
Character set encoding: UTF-8

Produced by: Emma Dudding, John Bickers, Dagny and David Widger

*** START OF THE PROJECT GUTENBERG EBOOK GRIMMS’ FAIRY TALES ***




Grimms’ Fairy Tales

By Jacob Grimm and Wilhelm Grimm
[...]

页脚看起来非常相似:

Taylor, who made the first English translation in 1823, selecting about
fifty stories ‘with the amusement of some young friends principally in
view.’ They have been an essential ingredient of children’s reading ever
since.




*** END OF THE PROJECT GUTENBERG EBOOK GRIMMS’ FAIRY TALES ***

Updated editions will replace the previous one--the old editions will
be renamed.

我的想法是使用这些三重星号标记来丢弃页眉和页脚,因为这样的操作对任何古腾堡版本都很有用。

使用正则表达式执行此操作的好方法是什么?

What is a good way to do this with regex?

要查找白色 space,您可以使用 ' ' 或 '\s'(注意:\s 将匹配所有白色 space 字符,如 \n、\r 等

要找到 * ,您必须像这样转义它:\* 因为 * 在正则表达式中表示零次或多次重复。

要检查 * 是否重复三次,可以将其转义三次或使用像 \*{3}

这样的量词

因此您的正则表达式可能如下所示:\*{3} 这将在每次找到三个 * 时匹配。

匹配三个 * 之间的所有内容,例如页眉和页脚。 您可以将正则表达式修改为:

^\*{3}[\w\W]*?\*{3}$

This means: 
^         - beginning of the line
\*{3}     - match three *
[\w\W]*?  - match every alphanumeric and non alphanumric chars
\*{3}     - match three *
$         - end of the line

在这里测试:https://regex101.com/r/d8dcHf/1

PS:我认为这个正则表达式可以优化或者可以创建一个更好的正则表达式。

我发现这个字符串符合我查找 headers 的目的,而且我预计在小说等的 body 中不会有任何冲突:

解决方案

/^\*\*\*.*\*\*\*$/m

说明

^ 匹配行首,\* 是转义通常有特殊用途的星号所必需的;为了简单起见,.* 匹配中间的任何内容,而 $ 匹配行尾。 m 用于多行模式,因为古腾堡作品包含规则间隔的 \n 换行符。

警告

我可以想象,如果任何文本有这样一行:

Gadzooks!
******
I woke up in a daze...

我们会以意外的比赛结束。有改进的余地,但目前这可能是不成熟的优化。