我有一个数组@WIALOG_lines,下面有条目
(0552) -*--@ "<No comment>" 27-Oct-2020 10:40 AM
(0553) M---$ user1 100900 "Random job
(0554) ----@ 1119996 "patch content"
(0562) -*--@ "<No comment>" 24-Oct-2020 10:40 AM
我需要在这个数组中有055205530554和0562。我正在尝试下面的命令,但不起作用。你能帮助正则表达式只获得括号中的值吗。
s/(^[^(]+")|("[^)]+)//g for @WIALOG_lines;
我们想要匹配第一组括号之间的数字。该模式是一个开放的paren、任何数量的非闭合paren的字符以及最后一个paren。我们想要捕捉括号之间的字符。圆括号在正则表达式中很特殊,因此需要转义。该正则表达式模式为:m/(([^)]*))/
,其中转义的圆括号完全匹配,另一对圆括号是捕获组。
然后,我们希望将该模式应用于原始数组的每一行,这建议使用映射块。对于原始数组的每个元素,进行匹配并返回匹配部分。$1
将是与第一个捕获组匹配的字符串。
my @key = map { m/(([^)]+))/; $1 } @WIALOG_lines;
如前所述,通过捕获括号中的数字将其存储在数组中以供进一步处理,可以很容易地实现已发布问题的解决方案。
use strict;
use warnings;
use feature 'say';
my @keys = map { $1 if /^((d+))/ } <DATA>;
say for @keys;
__DATA__
(0552) -*--@ "<No comment>" 27-Oct-2020 10:40 AM
(0553) M---$ user1 100900 "Random job
(0554) ----@ 1119996 "patch content"
(0562) -*--@ "<No comment>" 24-Oct-2020 10:40 AM
更有趣的情况是,如果输入数据需要一些额外的解析。下面的示例演示了这种方法。
注:标签为0553的记录的输入数据在关闭"
时丢失
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my %log;
while( <DATA> ) {
chomp;
my @col = /((d+))s+(S+)s+(.*)z/;
my $data;
if( $col[2] =~ /(.*) (d{2}-w{3}-d{4}) (d{2}:d{2}) (w{2})z/ ) {
$data = { comment => $1, date => $2, time => $3, AM => $4 };
} else {
$data = { user => $1 , label => $2, desc => $3 } if $col[2] =~ /(S+) (d+) (".*?"?)z/;
$data = { label => $1, desc => $2 } if $col[2] =~ /(d+) (".*?")z/;
}
$log{$col[0]} = { perm => $col[1], data => $data };
}
say Dumper(%log);
__DATA__
(0552) -*--@ "<No comment>" 27-Oct-2020 10:40 AM
(0553) M---$ user1 100900 "Random job
(0554) ----@ 1119996 "patch content"
(0562) -*--@ "<No comment>" 24-Oct-2020 10:40 AM
输出
$VAR1 = {
'0562' => {
'perm' => '-*--@',
'data' => {
'date' => '24-Oct-2020',
'AM' => 'AM',
'comment' => '"<No comment>"',
'time' => '10:40'
}
},
'0553' => {
'perm' => 'M---$',
'data' => {
'desc' => '"Random job',
'user' => 'user1',
'label' => '100900'
}
},
'0552' => {
'perm' => '-*--@',
'data' => {
'date' => '27-Oct-2020',
'time' => '10:40',
'AM' => 'AM',
'comment' => '"<No comment>"'
}
},
'0554' => {
'data' => {
'label' => '1119996',
'desc' => '"patch content"'
},
'perm' => '----@'
}
};