2012-02-28 83 views
0

我知道正則表達式可以使用,但無法找到正確的表達式。也有任何可用的內置函數嗎?如何匹配unix絕對路徑並使用perl提取它?

+0

你能更清楚地解釋一下你想要的嗎?究竟你想匹配和提取什麼?你可以給一些你想要匹配的輸入字符串嗎?不匹配,以及你在輸出什麼? – 2012-02-28 06:30:34

+1

不是沒有一些額外的限制,他們不能。現代* nix路徑可以包含除'\ 0'之外的任何字符。意思是,如果你願意,你可以有一條看起來像一個句子的路徑。絕對路徑名是唯一可以實現的功能,它是一個主要的斜線。 – cHao 2012-02-28 06:30:35

+0

「bmake:停在/ bb/cc/xx/yy/zz/aa」。從這裏我只是想提取/ bb/cc/xx/yy/zz/aa – 2012-02-28 06:35:54

回答

2

考慮:

bmake: stopped in /bb/cc/xx/yy/zz/aa 

此正則表達式將拉動路徑:

m%\s(/.*)% 

它看起來的空格字符後跟一個斜線跟着什麼。如果你沒有在你的路徑名的空白,那麼你可以使用更嚴格的:

m%\s(/\S*)% 

如果你相信你會一直有一個或多個路徑組件的名稱,你可以添加更多限制:

m%\s(/\S+/\S*)% 

然後繼續。您對路徑中的有效內容瞭解得越多,您匹配文件名的機會就越大。但是請注意,Unix上的文件名可以包含除/(因爲它是路徑名的各部分之間的分隔符)和\0(NUL字節)之外的任何字符。其他一切 - 換行符,製表符,控件等 - 都是公平的遊戲,可能是文件名的一部分。實際上,它們中的大多數通常不存在於文件名中。

請注意,相對路徑名比絕對路徑名更難。

1

/(.+/)*.*使用此模式。一開始就有斜線,然後是目錄(可能不是任何),最後是文件名或目錄名(這可能不是太完美)。實際上,這將匹配所有以斜線開頭的東西,但這是可以的,因爲unix中的路徑可以包含除\0之外的所有內容。

+0

在Perl中,我必須這樣做嗎? $ line =〜m/regex/?? – 2012-02-28 06:37:08

+0

yes.see this http://www.troubleshooters.com/codecorn/littperl/perlreg.htm – shift66 2012-02-28 06:38:17

+0

if($ line =〜/[/](.+[/])*.*/),這是否正確? – 2012-02-28 06:43:12

4

我建議使用File::Spec核心模塊來代替。如果您只需要檢查給予您的是絕對路徑,請使用file_name_is_absolute();如果您需要將相對路徑轉換爲絕對路徑,請使用rel2abs(),您會看到該模式。 )它更容易和更可讀。

相關問題