3

无论我做什么,我的正则表达式都匹配该行中的最后一组字母字符。我希望它只匹配第一次出现。

我尝试过使用非贪婪运算符,但它顽固地匹配最右边的字母字符集,在这种情况下,$1 的值是“Trig”,这不是我想要的。我希望 1 美元是“02.04.07.06 Geerite”。

代码

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 三角 | |

所以换句话说,我想要这个输出:

NT2 02.04.07.06 Geerite | |

4

4 回答 4

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 树的不同分支。

于 2011-12-08T14:53:49.360 回答
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+)/
于 2011-12-08T14:57:25.127 回答
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 | |
于 2011-12-08T14:59:55.497 回答
1

您的正则表达式无法匹配“32 Trig”。一定还有其他问题。

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

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

[[:alpha:]]*?尽可能少地匹配,因此由于没有更多的模式跟随,它将匹配 0 个字符。

于 2011-12-08T15:02:04.440 回答