我在一个文本文件里有这样的模式
Textfile.txt
----------------------
some text, Some text
some text, Some text
Line # 1
some text
Line # 2
some text
'
;
'
Line #n-1
some text
Line # n
some text
[some list]
我的目标是从
Line # 1
some text
Line # 2
some text
'
;
'
Line #n-1
some text
Line # n
some text
我使用了正则表达式,就像这样https://regexr.com/78o64
(Line #\s*\d+)\n(.*?)(?=\nLine #\s*\d|$)
我能够提取我的数据,但它无法解析最后一行(即,Line #n。在我们例子中行#69从上面提供的链接检查)。我做错什么了吗?.如有任何建议,欢迎提出。
3条答案
按热度按时间vyswwuz21#
Luca的评论是一个很好的解决方案:
你的正则表达式的问题是lookahead组:
它没有考虑数据末尾的列表,并且您没有正确地将组“或”在一起:
可能更接近你的意图这具有前瞻性,以寻找跟随有“Line # d”或行尾之前的括号之间的任何内容的新行。
您还希望将“或“d的元素组合在方括号中。否则,您将“或”单个字符组。
也就是说,Luca的建议要简单得多,并且在格式以某种方式更改时不会中断。
0aydgbwb2#
你可以试试(Regex101):
^Line # \d+\s*
-匹配行首的“Line #”+其余空格[^\n]+
-匹配之后的每个非换行符字符bcs8qyzn3#
您可以像这样编写模式,匹配以
Line #
开头,后跟1个或多个数字的行。然后匹配不以该模式开头的所有后续行。
说明
^
字符串开始Line #\s*\d+
匹配Line #
,后跟可选的空格字符和1+数字(?:
作为一个整体部分重复的非捕获组\n(?!Line #\s*\d+$)
匹配一个换行符,并Assert该行不以前面的模式开始.*
匹配整行)*
关闭非捕获组并选择重复以匹配所有行请参见regex demo。