我有以下文字文件:
#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)不被视为组而是单独的符号,因此它匹配第一行的末尾。
答案 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)+/