让$ PWD = / Unix_Volume / Users / a / b / c / d
我希望:
echo $PWD | perl -ne 'if( /(\w+)[^\/]/ ){ print $1; }'
显示“Unix_Volume”。但是,它显示“Unix_Volum”。为什么正则表达式不能捕获最后一个字符?
答案 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”。