讓$ PWD =/Unix_Volume /用戶/ A/B/C/d這個perl正則表達式爲什麼不捕獲最後一個字符?
我期望:
echo $PWD | perl -ne 'if(/(\w+)[^\/]/){ print $1; }'
顯示出 「Unix_Volume」。但是,它顯示「Unix_Volum」。爲什麼正則表達式不能捕獲最後一個字符?
讓$ PWD =/Unix_Volume /用戶/ A/B/C/d這個perl正則表達式爲什麼不捕獲最後一個字符?
我期望:
echo $PWD | perl -ne 'if(/(\w+)[^\/]/){ print $1; }'
顯示出 「Unix_Volume」。但是,它顯示「Unix_Volum」。爲什麼正則表達式不能捕獲最後一個字符?
由於\ W doesen't具有正斜槓在同類中,你爲什麼需要[^ \ /]?
/(\ w +)/會做。它捕獲了第一個這個類的發生。
編輯:/。 * \ b(\ w +)/捕獲最後發生的事件。
(\ W +)=> Unix_Volum
[^ \ /] => E(不是一個/)
/=>/
+1,打我吧。 ''[^ \ /''強制它在到達'/'之前再捕獲一個字符。 – 2011-03-11 16:01:58
嘗試:
export PWD=/Unix_Volume/Users/a/b/c/d
perl -MFile::Spec -e'print((File::Spec->splitdir($ENV{_pwd}))[1],"\n")'
你應該總是使用附帶的Perl在可能的模塊。有關它們的列表,請參閱perldoc perlmodlib
。
(\w+)
組貪婪地匹配並捕獲單詞字符「Unix_Volume」,將該位置留在「Unix_Volume」之後的位置。
的[^\/]
類迫使引擎備份(貪婪+
量詞放棄它的匹配,以滿足它後面的原子字符)來匹配一個字符不是「/」,在結束相匹配的「e」的「Unix_Volume」。由於匹配的「e」位於捕獲組的外部,因此您將在$ 1中留下「Unix_Volum」。
我想清楚這個問題。 '使用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