2013-10-18 70 views
1

我有以下的文本文件:正则表达式 - 如何不匹配两个换行符

#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)不会被视为组,而是单独的符号,因此它会匹配第一行的结尾。

+2

会换行(在Windows上)不'\ r \ N' ? – AutomatedChaos

+1

你正在使用哪个正则表达式平台? Javascript,PERL,.Net? – Gusdor

+0

你想保持换行吗?或者只有拥有一群孤独的人,你会高兴吗? – Bohemian

回答

1

使用正前瞻:

.+?(?=^$) 

这就要求“在换行符^ $匹配的交换机和“点新的生产线相匹配”。

您可以激活式“点新行一致” ......

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

...但很可惜,蟒蛇只允许一个模式修改,所以你需要在^ $切换到代码。

输入:

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)?) 
+0

这个'(。+ \ r?\ n)+(?= \ r \ n)'不起作用,但'(?s)。+?(?=^$)'起作用。谢谢! – Tom

0

分割上先行了一个空行:

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

使用“多行”正则表达式开关(?m)使得^和$匹配的开始/线的终点,并通过使用\s匹配换行符手段这将工作在Unix,Mac和Windows文件。

这将保留空白行,但如果你只想线,改变正则表达式来删除THR向前看(?m)$\\s^$

0

测试上regexr,下面似乎产生正确的结果。我正在捕获第一个空行,就像你的例子。请注意,使用dotall(/ s)开关可以选取整个块,并使用惰性匹配(+?)阻止它一直运行到最后。

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

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

+0

它仅匹配每一部分的最后一行文本 - 这不是我想要的,但谢谢!我正在使用Gusdor代码。 – Tom

+0

如果你错过了dotall开关,会发生这种情况。 Gusdor没有开关的代码很好。 – AnkurTG

0

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

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