perl regex用于提取多行块

cri*_*sti 8 regex perl

我有这样的文字:

00:00 stuff
00:01 more stuff
multi line
  and going
00:02 still 
    have
Run Code Online (Sandbox Code Playgroud)

所以,我没有一个块结束,只是一个新的块启动.

我想以递归方式获取所有块:

1 = 00:00 stuff
2 = 00:01 more stuff
multi line
  and going
Run Code Online (Sandbox Code Playgroud)

等等

波纹管代码只给我这个:

$VAR1 = '00:00';
$VAR2 = '';
$VAR3 = '00:01';
$VAR4 = '';
$VAR5 = '00:02';
$VAR6 = '';
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

my $text = '00:00 stuff
00:01 more stuff
multi line
 and going
00:02 still 
have
    ';
my @array = $text =~ m/^([0-9]{2}:[0-9]{2})(.*?)/gms;
print Dumper(@array);
Run Code Online (Sandbox Code Playgroud)

tux*_*day 3

这应该可以解决问题。下一个\d\d​​:\d\d 的开头被视为块结束。

use strict;

my $Str = '00:00 stuff
00:01 more stuff
multi line
  and going
00:02 still 
    have
00:03 still 
    have' ;

my @Blocks = ($Str =~ m#(\d\d:\d\d.+?(?:(?=\d\d:\d\d)|$))#gs);

print join "--\n", @Blocks;
Run Code Online (Sandbox Code Playgroud)

  • 您的非捕获括号 `(?: ... )` 在这里是多余的,因为 `(?= ...)` 也可以使用替换。另外,我注意到您仍然没有编写“严格”兼容的代码,这在我的书中是不好的,因为它鼓励了不良实践。 (2认同)
  • 是的,我确实介意。您介意停止发布非严格代码吗?这是一个学习环境,发布鼓励良好实践的代码不需要*任何*,不是吗? (2认同)
  • 没有人关心你在另一条帖子中说的话。他们怎么知道要去看那里?请记住,StackOverflow 会联合其内容,因此您的答案可能会单独显示在其他网站上。 (2认同)