我工作了将近3个小时,但我无法找到解决方案。所以我来这里是为了你的帮助。
下面是我的测试字符串:
Object: TLE-234DSDSDS324-234SDF324ER
Page location: SDEWRSD3242SD-234/324/234 (1)
org-chart Lorem ipsum dolor consectetur adipiscing # Colorado
234DSDSDS324-32-4/2/7-page2 (2) loc log Apr 18 21:42:49 2017 1
Page information: 3.32.232.212.23, Error: fatal, Technique: color
Comments: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Validation status: Lorem ipsums dolors sits amets, consectetur adipiscing elit
Positive control-export: Validated
Page location: SDEWRSD3242SD-SDF/234/324 (5)
org-chart Lorem ipsum dolor consectetur adipiscin # Arizona
234DSDSDS324-23-11/1/0-page1 (1) loc log Apr 18 21:42:49 2017 1
Page information: 3.32.232.212.23, Error: log, Technique: color
Comments: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Validation status: Lorem ipsums dolors sits amets, consectetur adipiscing elit
Positive control-export: Validated
我需要在" Page location:"," Object:"之后捕获字符串。和"评论:"
例如:
对象: TLE-234DSDSDS324-234SDF324ER - 第1组
页面位置: SDEWRSD3242SD-234/324/234(1) - 第2组
页面位置: SDEWRSD3242SD-SDF / 234/324(5) - 第3组
评论: Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 - Group 4
评论: Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 - 第5组
这是我的regex url ,
我能够捕获字符串,但是如果任何一个字符串重复,则正则表达式不会捕获。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:1)
(请参阅问题描述问题下方的评论。)
数据采用多行字符串,多个部分以Object:
开头。每个行中都有多个以短语Page location:
和Comments:
开头的行。需要捕获所有这些内容的其余部分,并由Object
s。
不要尝试折磨的多行“单一”正则表达式,而是将字符串分成几行并逐段处理。这样问题变得非常简单。
结果存储在hashrefs数组中;每个键都有键显示的短语。由于它们每个部分可以出现多次,因此它们的值是arrayrefs(在行上跟随它们)。
use warnings;
use strict;
use feature 'say';
my $input_string = '...';
my @lines = split /\n/, $input_string;
my $patt = qr/Object|Page location|Comments/;
my @sections;
for (@lines)
{
next if not /^\s*($patt):\s*(.*)/;
push @sections, {} if $1 eq 'Object';
push @{ $sections[-1]->{$1} }, $2;
}
foreach my $sec (@sections) {
foreach my $key (sort keys %$sec) {
say "$key:";
say "\t$_" for @{$sec->{$key}};
}
}
复制输入字符串(为简洁起见,上面禁止),输出为
Comments: Lorem ipsum dolor sit amet, [...] Lorem ipsum dolor sit amet, [...] Page location: SDEWRSD3242SD-234/324/234 (1) SDEWRSD3242SD-SDF/234/324 (5) Object: TLE-234DSDSDS324-234SDF324ER
一些评论。
找到Object
行后,我们会向@sections
添加新的hashref。然后将模式的匹配设置为键,并将其余部分添加到其arrayref值。这是针对@sections
的当前(最后)元素完成的。
如果模式后面没有任何内容,则会添加一个空字符串。禁止添加next if not $2;
请注意。打印复杂数据结构的一种简单而常见的方法是通过核心模块Data::Dumper。但另请参阅Data::Dump以获得更紧凑的打印输出。