2011-02-26 64 views
1

比方說,我有一個包含Unix風格的本地文件路徑類似於下面的示例的字符串:如何從字符串中提取Unix風格的本地文件路徑?

String s1 = "something something ./files/icon.gif"; 
String s2 = "The files are texts/text1.txt and texts/text2.txt"; 
String s3 = "<img src="images/img/run.png" alt="" />" 

所以,我需要只提取文件路徑:

"./files/icon.gif" 
"texts/text1.txt", "texts/text2.txt" 
"images/img/run.png" 

我已經拿出了以下正則表達式:

\.?[[a-zA-Z0-9]*/]+\.[a-zA-Z0-9]+ 

它爲這些測試用例做了工作。

現在,我的擔心是,這可能拉出不是文件路徑的其他文本,只看起來像一個,因爲它在正確的位置有斜槓和點。

有沒有更好的方法來處理這個問題(甚至可能不使用正則表達式)?

+3

我不明白你怎麼能夠寫出一些能區分實際文件路徑和某些只是看起來像文件路徑的東西。除非您還能夠將這些路徑驗證爲現有文件的實際路徑。如果有人寫道「在Stackoverflow上,你可以向上/向下投票答案」。 「上/下」可以是一個文件路徑,沒有某種上下文感知或人工智能就無法知道。 – johusman 2011-02-26 13:25:03

+0

@ johusman:的確如此。我目前的正則表達式不會提取「上/下」,只是因爲它沒有文件擴展名。既然,一個文件確實不需要擴展名,這不是一個好的理由。 – 2011-02-26 13:29:56

+0

術語「擴展名」是特定於DOS/Windows的,它確實是文件名的特殊部分。在類Unix系統中,它只是一個文件名的一部分,恰好與其餘部分相隔一點。所以你完全在這裏,這不會有幫助。 – 2011-02-26 13:36:46

回答

3

你不能這樣做。 Unix文件名可以包含除NUL和/之外的所有字符,因此任何沒有嵌入NUL的字符串都是有效的路徑。見:

[[email protected] tmp]$ mkdir -p 'String s1 = "something something ./files/icon.gif";' 
[[email protected] tmp]$ ll -d String* 
drwxr-xr-x 3 alqualos alqualos 4096 2011-02-26 16:31 String s1 = "something something . 
[[email protected] tmp]$ ll String\ s1\ \=\ \"something\ something\ ./ 
total 4K 
drwxr-xr-x 3 alqualos alqualos 4096 2011-02-26 16:31 files 
[[email protected] tmp]$ ll String\ s1\ \=\ \"something\ something\ ./files/ 
total 4K 
drwxr-xr-x 2 alqualos alqualos 4096 2011-02-26 16:31 icon.gif"; 

所以你所有的字符串都是有效的文件路徑。如果你想提取看起來像「合理」路徑的所有東西,那麼你必須首先定義「合理」,即使這樣你可能會因爲源文本中的「TCP/IP」等原因而失敗。

+0

看來,真正的唯一方法就是按照您的建議,定義涵蓋足夠大的病例子集的「合理」文件名。謝謝! – 2011-02-26 15:39:31