2011-03-11 59 views
0

让$ PWD =/Unix_Volume /用户/ A/B/C/d这个perl正则表达式为什么不捕获最后一个字符?

我期望:

echo $PWD | perl -ne 'if(/(\w+)[^\/]/){ print $1; }' 

显示出 “Unix_Volume”。但是,它显示“Unix_Volum”。为什么正则表达式不能捕获最后一个字符?

+0

我想清楚这个问题。 '使用Path :: Class; (file'/ Unix_Volume/Users/a/b/c/d') - > parent-> dir_list;'returns'('',qw(Unix_Volume Users a b c))'。 – daxim 2011-03-11 16:15:11

回答

1

由于\ W doesen't具有正斜杠在同类中,你为什么需要[^ \ /]?

/(\ w +)/会做。它捕获了第一个这个类的发生。

编辑:/。 * \ b(\ w +)/捕获最后发生的事件。

8

(\ W +)=> Unix_Volum

[^ \ /] => E(不是一个/)

/=>/

+0

+1,打我吧。 ''[^ \ /''强制它在到达'/'之前再捕获一个字符。 – 2011-03-11 16:01:58

2

尝试:

export PWD=/Unix_Volume/Users/a/b/c/d 
perl -MFile::Spec -e'print((File::Spec->splitdir($ENV{_pwd}))[1],"\n")' 

你应该总是使用附带的Perl在可能的模块。有关它们的列表,请参阅perldoc perlmodlib

0

(\w+)组贪婪地匹配并捕获单词字符“Unix_Volume”,将该位置留在“Unix_Volume”之后的位置。

[^\/]类迫使引擎备份(贪婪+量词放弃它的匹配,以满足它后面的原子字符)来匹配一个字符不是“/”,在结束相匹配的“e”的“Unix_Volume”。由于匹配的“e”位于捕获组的外部,因此您将在$ 1中留下“Unix_Volum”。

相关问题