正则表达式 - 如何不匹配两个换行符

时间:2013-10-18 11:26:28

标签: regex

我有以下文字文件:

#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 个答案:

答案 0 :(得分: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)?)

答案 1 :(得分:0)

在前瞻时拆分空白行:

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

/\n(?:[^\n]+\n)+/