为什么这个perl正则表达式不能捕获最后一个字符?

时间:2011-03-11 15:52:44

标签: regex perl

让$ PWD = / Unix_Volume / Users / a / b / c / d

我希望:

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

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

4 个答案:

答案 0 :(得分:8)

(\ w +)=> Unix_Volum

[^ \ /] => e(不是/)

/ => /

答案 1 :(得分: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

答案 2 :(得分:1)

由于\ w在其类中没有正斜杠,为什么需要[^ \ /]?

/(\ w +)/会这样做。它捕获了此类的第一次出现。

编辑:/.*\b(\w+)/抓住最后一次出现。

答案 3 :(得分:0)

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

[^\/]类强制引擎备份(贪婪的+量词放弃匹配的字符以满足跟随它的原子)以匹配不是“/”的字符,匹配“Unix_Volume”末尾的“e”。由于匹配的“e”在捕获组之外,因此您将在$ 1中留下“Unix_Volum”。