2013-05-15 232 views
0

提取路徑,我想在的形式提取路徑:正則表達式:從字符串

$ /服務器/第一級文件夾/ Second_Level_Folder /我File.extension

這裏的挑戰是,路徑嵌入在 「自由形式」 的電子郵件,像這樣:

你好,

You can download the file here: 
  • $ /服務器/一級文件夾/ Second_Level_Folder/My File.extension < - 點擊我!

給定一個字符串,我想用正則表達式從中提取的所有路徑。這甚至有可能嗎?

謝謝!

+3

工具?語言? – Kent

+0

是否總是說「< - 點擊我!」最後還是終點有時會有所不同?否則,我認爲不可能在同一行上區分其他文本的路徑。 – Tharwen

+0

Something [like this](http://regex101.com/r/vW7bR1)應該可以幫助你... – HamZa

回答

5

是的,這是可能的(\$/.*?\.\S*)應該做的工作就好了。

\$/路徑

.*?匹配的一切,直到正則表達式

\.\S*點和任何東西,但一個空格相匹配的下一個部分(空格,製表符)的開頭匹配

而且(圍繞它的)使其捕獲所有匹配的內容。

編輯:

進一步使用

人的路

(\$/.*?/)[^/]*?\.\S*

不僅是文件名

\$/.*?/([^/]*?\.\S*)

+0

謝謝!有用!只是一個後續,如果我還想只匹配到「目錄」級別,如下所示:$/Server/First Level Folder/Second_Level_Folder – Ian

+0

假設之後有一個文件,可以通過'( ($ \。*?/)'匹配路徑 但是'(?:[^ \] *?\。\ S *)' ' /] *?\。\ S *)'使用?匹配文件名:該組未被捕獲。 所以如果你想要文件名而不是路徑使用'(?:\ $ /。*?/)([^ /] *?\。\ S *)' – B8vrede

+0

(\ $ /。*?/) (?:[^ /] *?\。\ S *)和(?:\ $ /。*?/)([^ /] *?\。\ S *)不起作用。我嘗試使用http://regexpal.com/ – Ian

1

如果文件名包含[escapeped forward slab/or no period symbol]並且文件路徑空間用反斜槓'\'轉義,您仍然可以使用它(我已經避開了前斜槓和後斜槓)

(\/.*?\/)((?:[^\/]|\\\/)+?)(?:(?<!\\)\s|$) 

Regular expression visualization

Debuggex Demo

這就造成了兩個拍攝組 - 一個用於路徑和一個用於文件名前綴。如果您的測試字符串包含轉義空格的文件名(如圖所示),那麼你將不得不使用文件名中期內如因錨按B8vrede的答案。