无法让perl正则表达式变得非贪婪

时间:2011-12-08 14:48:51

标签: regex perl greedy regex-greedy non-greedy

我的正则表达式匹配行中最后一组字母字符,无论我做什么。我希望它只匹配第一次出现。我曾尝试使用非贪婪的运算符,但它固执地匹配最右边的字母字符集,在这种情况下给$ 1值“Trig”,这不是我想要的。我希望1美元成为“02.04.07.06 Geerite”。

任何帮助将不胜感激!

CODE:

elsif ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/)
{
    print OUTPUT "NT5 ".$1." | | \n";
}

来源:

  

02.04.07.06 Geerite Cu8S5 R 3m,R 3m或R 32 Trig

输出:

  

NT2 32 Trig | |

换句话说,我想要的输出是:

  

NT2 02.04.07.06 Geerite | |

4 个答案:

答案 0 :(得分:1)

如果我将您的代码更改为

$line="     02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig ";
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/) { print "NT5 ".$1." | | \n"; }

我得到了这个输出:

NT5 02.04.07.06  | | 

使*非贪婪,Geerite这个词包含在输出中。

您观察到的输出可能来自if-elsif-else树的不同分支。

答案 1 :(得分:1)

这应该适合你:

perl -e '$_ = "02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig"; print "$1\n" if /(\d\d\.\d\d\.\d\d\.\d\d \w+)/'

打印:

02.04.07.06 Geerite

正则表达式本身:

/(\d\d\.\d\d\.\d\d\.\d\d \w+)/

答案 2 :(得分:1)

[[:alpha:]]贪婪:

$line = '   02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig';
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/) {
    print OUTPUT "NT5 ".$1." | | \n";
}

<强>输出:

NT5 02.04.07.06 Geerite | | 

答案 3 :(得分:1)

你的正则表达式不能匹配“32 Trig”,还有其他一些问题。

如果我在示例字符串的开头添加一个空格并在最后一个量词之后删除不合格的?,它将产生您想要的输出。

$line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/

[[:alpha:]]*?将尽可能少地匹配,因为下面没有更多模式,它将匹配0个字符。