在perl中可以使用更多字符的单独行

时间:2014-05-25 09:21:47

标签: regex perl

我想删除这些行

John Smith !! NewYork ! 01123 ! 3012-1-315-2164
Alexander Goblin -- WA ------ 9752 - 53-76-132-310
Bittner Albin    Cered   3123    26-1-278-127

可以 - !之间的话 我尝试过如下,但它不起作用

while(<FILE>) {
        if($_=~m/(\w+\s\w+)((\t) | (\s!+\s) | (\s-+\s))(\w+)((\t) | (\s!+\s) | (\s-+\s)(\d+)((\t) | (\s!+\s) | (\s-
                (\d\d-\d\d-\d+-\d+)/){
                        print $1."\n";
        }
}

我认为这是问题:((\t) | (\s!+\s) | (\s-+\s))

1 个答案:

答案 0 :(得分:1)

如果要提取前两个单词,可以使用

if (m/(\w+\s+\w+)/) {
    print "$1\n";
}

如果要将这些行拆分为其字段,可以使用

my @field = split /\s+!+\s+ | \s+-+\s+ | \t+ /x;

以下是完整示例:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @record;
while (<DATA>) {
    chomp;
    if (m/(\w+\s+\w+)/) {
        print "$1\n";
    }

    my @field = split /\s+!+\s+ | \s+-+\s+ | \t+ /x;
    push @record, \@field;
}

print Dumper(\@record);

__DATA__
John Smith !! NewYork ! 01123 ! 3012-1-315-2164
Alexander Goblin -- WA ------ 9752 - 53-76-132-310
Bittner Albin   Cered   3123    26-1-278-127

注意:上面代码中最后一行的分隔符是\t,而不是三/四个空格。


上述计划的输出:

$ perl t.pl 
John Smith
Alexander Goblin
Bittner Albin
$VAR1 = [
          [
            'John Smith',
            'NewYork',
            '01123',
            '3012-1-315-2164'
          ],
          [
            'Alexander Goblin',
            'WA',
            '9752',
            '53-76-132-310'
          ],
          [
            'Bittner Albin',
            'Cered',
            '3123',
            '26-1-278-127'
          ]
        ];