regex 正则表达式无法提取最后一行

9gm1akwq  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(134)

我在一个文本文件里有这样的模式
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从上面提供的链接检查)。我做错什么了吗?.如有任何建议,欢迎提出。

vyswwuz2

vyswwuz21#

Luca的评论是一个很好的解决方案:

(Line #\s*\d+)\n(.*?)(?=\n)

你的正则表达式的问题是lookahead组:

(?=\nLine #\s*\d|$)

它没有考虑数据末尾的列表,并且您没有正确地将组“或”在一起:

(?=\n[Line #\s*\d]|[\[.*\]$])

可能更接近你的意图这具有前瞻性,以寻找跟随有“Line # d”或行尾之前的括号之间的任何内容的新行。
您还希望将“或“d的元素组合在方括号中。否则,您将“或”单个字符组。
也就是说,Luca的建议要简单得多,并且在格式以某种方式更改时不会中断。

0aydgbwb

0aydgbwb2#

你可以试试(Regex101):

(^Line # \d+\s*)([^\n]+)

^Line # \d+\s*-匹配行首的“Line #”+其余空格
[^\n]+-匹配之后的每个非换行符字符

bcs8qyzn

bcs8qyzn3#

您可以像这样编写模式,匹配以Line #开头,后跟1个或多个数字的行。
然后匹配不以该模式开头的所有后续行。

^Line #\s*\d+(?:\n(?!Line #\s*\d+$).*)*

说明

  • ^字符串开始
  • Line #\s*\d+匹配Line #,后跟可选的空格字符和1+数字
  • (?:作为一个整体部分重复的非捕获组
  • \n(?!Line #\s*\d+$)匹配一个换行符,并Assert该行不以前面的模式开始
  • .*匹配整行
  • )*关闭非捕获组并选择重复以匹配所有行

请参见regex demo

相关问题