Perl:regex来剪切括号中的单词

  • 本文关键字:单词 regex Perl regex perl
  • 更新时间 :
  • 英文 :


我有一个数组@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' => '----@'
                    }
        };

最新更新