Regex Can';不要让Perl正则表达式不贪婪

Regex Can';不要让Perl正则表达式不贪婪,regex,perl,greedy,regex-greedy,non-greedy,Regex,Perl,Greedy,Regex Greedy,Non Greedy,无论我做什么,我的正则表达式都匹配行中最后一组字母字符。我希望它只匹配第一个事件 我曾尝试使用非贪婪运算符,但它顽固地匹配最右边的一组alpha字符,在本例中为$1提供了值“Trig”,这不是我想要的。我希望1美元是“02.04.07.06 Geerite” 代码 来源 02.04.07.06 Geerite Cu8S5 R 3m、R 3m或R 32三角 输出 NT2 32触发器| 换句话说,我想要这个输出: NT5 02.04.07.06 | | NT2 02.04.07.06 Geer

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

我曾尝试使用非贪婪运算符,但它顽固地匹配最右边的一组alpha字符,在本例中为$1提供了值“Trig”,这不是我想要的。我希望1美元是“02.04.07.06 Geerite”

代码 来源 02.04.07.06 Geerite Cu8S5 R 3m、R 3m或R 32三角

输出 NT2 32触发器|

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

NT5 02.04.07.06  | | 
NT2 02.04.07.06 Geerite||


如果我把你的密码改成

$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树的另一个分支。

这应该适用于您:

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+)/

使
[: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吉瑞特||
您的正则表达式不能匹配“32 Trig”。一定还有别的问题

如果我在示例字符串的开头添加空格,并删除最后一个量词后的ungreedy
,它将生成所需的输出

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

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

您的输出以
NT2
作为前缀,而不是代码示例中的
NT5
,您确定这是实际匹配的正则表达式吗?非常感谢您的回答。事实上,这是elsif树中其他地方的一个错误。