$ 1不包含值

时间:2013-11-07 22:15:02

标签: regex perl

我正在编写一个脚本,该脚本使用正则表达式从文本文件中识别和提取各种不同格式的年份。以下是有问题的代码:

if ($parts[0] =~ /^\(*(\d\d\d\d)\)*$/) {
    # Matches a single 4 digit date in parentheses such as (1979)
    $start = $1;
    $end = $1;
} 
elsif ($parts[0] =~ m{\d\d\d\d\/\d\d\d\d} ) {
    # Matches cases like 1948/1972
    warn "Found a $1";
    #do some other stuff
}

我遇到的问题是,它找到与elsif中的表达式匹配的日期,但$1不包含值,,它打印出来一遍又一遍"Found a "条消息,但$1没有任何价值。谁能让我知道我在这里做错了什么?如果这是一个愚蠢的错误,我道歉。

谢谢!

2 个答案:

答案 0 :(得分:5)

首先,启用警告。

它没有设置$1,因为您没有捕获m{\d\d\d\d\/\d\d\d\d}正则表达式中的任何内容。也许你的意思是做m{(\d\d\d\d/\d\d\d\d)}

答案 1 :(得分:1)

在实际使用()部分中的$1之前,您需要使用elsif捕获匹配项。

此外,正则表达式可以缩短如下:

if ($parts[0] =~ /^\(*(\d{4})\)*$/) {
    # Matches a single 4 digit date in parentheses such as (1979)
    $start = $end = $1;
} 
elsif ($parts[0] =~ /^(\d{4}\/\d{4})$/ ) {
    # Matches cases like 1948/1972
    warn "Found a $1";
    #do some other stuff
}