从Perl中的字符串中提取并分配匹配的正则表达式模式到变量

时间:2014-08-29 22:00:10

标签: regex perl

好的,我尝试了一些选项,但我没有做对 - 看起来它是我的正则表达式规范的问题,但也可能是其他语法。非常感谢任何帮助/指导。

我正在尝试读取CSV文件并一次处理一行 - 丢弃标题行。我将特别关注该文件中的两个字段。

现在我一次读取一行文件后,我正在尝试处理这两个字段:

while ( my $line = <$data> ) {
    chomp $line;
    if ( $line !~ /^Date/ ) {
        if ( $line =~ /"/ ) { $line =~ s|"||g }

        ...;

        my $homeTeam = getTeam( $fields[5] );
        my $awayTeam = getTeam( $fields[7] );

        ...;

        my $arbiterRec = join ",", $gameDate, $gameTime, "", $season, $gameLevel,
            $homeTeam, "", $awayTeam, "", $site, $subSite, "", "";
        print "$arbiterRec\n";
    }
}

sub getTeam {
    my ($team) = trim( $_[0] ) =~ m{(R\d+-\d+B|G\d+$)}x;
    return $team;
}

sub trim {
    ( my $s = $_[0] ) =~ s/^\s+|\s+$//g;
    return $s;
}

有了这个,如果我有一个输入(感兴趣的字段标有^^^):

mm/dd/yyyy, hh:mm AA, dd, Aaaaaa, aaD, R35-14G1, , U14 Girls Area Schedule R256-14G1, , AAA, , , 
                                       ^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我希望获得如下输出:

mm/dd/yy, hh:mm AA, dd, Aaaaaa, aaD, R35-14G1, , R256-14G1, , AAA, , , 
                                     ^^^^^^^^    ^^^^^^^^^

取而代之的是:

mm/dd/yy, hh:mm AA, dd, Aaaaaa, aaD, G1, , G1, , AAA, , , 
                                     ^^    ^^

知道我在语法或RegEx匹配中可能出错了吗?

1 个答案:

答案 0 :(得分:1)

只需将正则表达式更改为

即可
(R\d+-\d+(?:B|G)\d+$)

实际问题是(R\d+-\d+B|G\d+$)正则表达式首先检查单词是以R开头,后跟一个或多个数字,然后是 - 最后是B。但是在你的输入中没有这样的词。所以这会失败。接下来,它将转到以G开头的第二部分,最后它与最后一个G以及后面的一个或多个数字匹配。