2011-03-11 57 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」。

相關問題