正则表达式确保每个部分结束后只有一个空行(2 个换行符)并且另一个部分在任何 Text-INI 文件中开始

Regex ensure that there's only one blank line(2 newlines) after each section ends and another section begins in any Text-INI file

正如我在问题标题中提到的,我有以下 INI 文件,其中包含无数个部分,每个部分包含无数行:

....
....   (many more section up above)
....
[Zynga Games *]
Section=Games
DetectFile=%LocalAppData%\Zynga
FileKey1=%LocalAppData%\Zynga\Logs|*.*|RECURSE

[*Microsoft Windows Game Statistics]
LangSecRef=3025
DetectOS=6.0
DetectFile=%localappdata%\Microsoft Games\
Default=False
FileKey1=%localappdata%\Microsoft Games\Chess Titans\|chesstitans.xml
FileKey2=%localappdata%\Microsoft Games\Freecell\|freecell.xml
FileKey3=%localappdata%\Microsoft Games\Hearts\|hearts.xml
FileKey4=%localappdata%\Microsoft Games\Mahjong Titans\|mahjong titans.xml
FileKey8=%localappdata%\Microsoft Games\Minesweeper\|minesweeper.xml
FileKey5=%localappdata%\Microsoft Games\Purble Place\|purble place.xml
FileKey6=%localappdata%\Microsoft Games\Solitaire\|solitaire.xml
FileKey7=%localappdata%\Microsoft Games\Spider Solitaire\|spider solitaire.xml

[iMVU Cache]

LangSecRef=3022

DectectFile=%appdata%\IMVUClient\IMVUClient.exe

Default=False

FileKey1=%appdata%\IMVU\cache\|*.*|REMOVESELF|

FileKey2=%appdata%\IMVU\AssetCache\|*.*|REMOVESELF|

FileKey3=%appdata%\IMVU\PixmapCache\|*.*|REMOVESELF|
....
....        (many more could be below too...)
....

现在你可以看到,当我从外部 Google 搜索页面粘贴代码时,有时这些代码带有额外的换行符,它们出现在每一行之后,这有点打破 and/or 格式的模式INI 文件确保 一个部分的结尾和另一个部分的开头之间有 2 个换行符,并且每个部分的 children 行之后只有一个换行符

现在我知道使用 Regex 我们可以通过 Find:\n\n*Replace with: [=14= 将多个换行符替换为单个换行符] 在任何支持 PCRE Regex 的文本编辑器中,但是当有额外的换行符分布在一个部分的 multiple/all children 行时,那么我如何对其进行文本处理以确保只有一个换行符在一个部分的每个 children 行之间和整个文件中连续部分之间的 2 个换行符之间?

所以在正则表达式替换文本处理后最终输出是这样的:

....
....   (many more section up above)
....
[Zynga Games *]
Section=Games
DetectFile=%LocalAppData%\Zynga
FileKey1=%LocalAppData%\Zynga\Logs|*.*|RECURSE

[*Microsoft Windows Game Statistics]
LangSecRef=3025
DetectOS=6.0
DetectFile=%localappdata%\Microsoft Games\
Default=False
FileKey1=%localappdata%\Microsoft Games\Chess Titans\|chesstitans.xml
FileKey2=%localappdata%\Microsoft Games\Freecell\|freecell.xml
FileKey3=%localappdata%\Microsoft Games\Hearts\|hearts.xml
FileKey4=%localappdata%\Microsoft Games\Mahjong Titans\|mahjong titans.xml
FileKey8=%localappdata%\Microsoft Games\Minesweeper\|minesweeper.xml
FileKey5=%localappdata%\Microsoft Games\Purble Place\|purble place.xml
FileKey6=%localappdata%\Microsoft Games\Solitaire\|solitaire.xml
FileKey7=%localappdata%\Microsoft Games\Spider Solitaire\|spider solitaire.xml

[iMVU Cache]
LangSecRef=3022
DectectFile=%appdata%\IMVUClient\IMVUClient.exe
Default=False
FileKey1=%appdata%\IMVU\cache\|*.*|REMOVESELF|
FileKey2=%appdata%\IMVU\AssetCache\|*.*|REMOVESELF|
FileKey3=%appdata%\IMVU\PixmapCache\|*.*|REMOVESELF|
....
....        (many more could be below too...)
....

在 Regex 中不是这样 well-versed 所以任何帮助都将不胜感激...

在Notepad++和Sublime Text中,可以使用

查找内容(\R){2,}(?!\R*\[[^][]*]$)
替换为</code></p> <p>见<a href="https://regex101.com/r/6iFchr/1" rel="nofollow noreferrer">regex demo</a>。 <em>详情</em>:</p> <ul> <li><code>(\R){2,} - 两个或多个换行符序列(最后捕获的一个保存在第 1 组内存缓冲区中)

  • (?!\R*\[[^][]*]$) - 如果有则匹配失败的否定前瞻
    • \R* - 零个或多个换行序列
    • \[ - 一个 [ 字符
    • [^][]* - []
    • 以外的零个或多个字符
    • ] - 一个 ] 字符
    • $ - 一行结束。
  • 在 Visual Studio 代码中,这个正则表达式需要稍微调整一下:

    (\n){2,}(?!\n*\[[^\][]*\]$)
    

    这里,\n匹配任意行尾(不需要\R),文字方括号需要转义(只需要字符class里面的[不需要转义)。

    从 Wiktor 答案作弊和复制,
    这段代码在我的编辑器中给了我预期的结果...

    查找:(?!\n*\[)(\n){2,}
    替换为: