2

我有以下文本文件:

#Beginning of the file

aaa
bbbb
ccc

dddd
eee
ffff

ggggg
hhhsasas
dsdsd

#end of file

如何匹配从每个部分开头的空行开始的该文件的一部分与从该部分到文本部分末尾的文本(下一部分之间没有新行)?因此,使用上面的示例,我想获得 3 个匹配项:

#Beginning of the first match    

aaa
bbbb
ccc
#End of first match
#Beginning of the second match

dddd
eee
ffff
#End of second match
#Beginning of the third match

ggggg
hhhsasas
dsdsd
#End of third match

我试过这样的事情:

(\n\n)[^(\n\n)]*

但它不能按我的意愿工作,因为 ^(\n\n) 不被视为组,而是单独的符号,因此它匹配第一行的结尾。

4

4 回答 4

3

使用积极的前瞻:

.+?(?=^$)

这需要“点匹配新行”和“^$ 匹配换行”开关。

您可以在表达式中激活“点匹配新行”...

(?s).+?(?=^$)

...但是唉,python 只允许一个模式修饰符,所以你需要在 ^$ 开关中编码。

输入:

aaa
bbbb
ccc

dddd
eee
ffff

ggggg
hhhsasas
dsdsd

结果:

Match 1:    
aaa
bbbb
ccc
         0      18
Match 2:    
dddd
eee
ffff
        18      19
Match 3:    
ggggg
hhhsasas
dsdsd
        37      26

编辑

这是没有开关的全部内容。注意平台独立性的可选回车。最后的空行也是可选的:

(.+\r?\n)+(?=(\r?\n)?)
于 2013-10-18T11:43:16.293 回答
0

为空行拆分前瞻:

String[] sets = input.split("(?m)(?=$\\s^$)");

使用“多行”正则表达式开关(?m)使 ^ 和 $ 匹配行的开始/结束,并且通过使用\s匹配换行符意味着这将适用于 unix、mac 和 windows 文件。

这会保留空白行,但如果您只想要这些行,请更改正则表达式以删除 thr 向前看(?m)$\\s^$

于 2013-10-18T11:34:28.387 回答
0

在正则表达式上测试,以下似乎产生了正确的结果。如您的示例所示,我正在捕获第一个空行。请注意使用 dotall (/s) 开关来允许选择整个块,并使用惰性匹配 (+?) 来阻止它一直运行到最后。

/\b.+?(?=\r\r)/gs

我希望您需要根据您的环境使用正确的换行符。

于 2013-10-18T11:41:14.043 回答
0

一个新行+(字符不是新行+新行)重复

/\n(?:[^\n]+\n)+/
于 2013-10-18T11:53:38.220 回答