2015-10-28 66 views
0

想想看,我有以下的字符串,它是一個「完整路徑」:正則表達式來動態地忽略指定路徑的某些部分

/A/B/C/D/E  

而且也有「簡化路徑」字符串:

/A/B/E 

我有一種情況,字符串的某些部分可以省略,仍然可以表示完整路徑。我知道這很奇怪,但我無法改變它。

基本上是這種情況下,我需要一個正則表達式忽略當前路徑前的最後兩個路徑(動態,因爲我對他們有沒有具體的信息),以確認這兩個字符串具有相關性。

我可以想出的唯一的事情就是:

  • 從兩個字符串以當前路徑(([^\/]+$))和比較。
  • 如果完整字符串包含簡化字符串,請檢入Java。

但我認爲必須有做一個更清潔的方式。

+0

他們指向同一個文件或目錄嗎? – SomeJavaGuy

+0

這是一個路徑,但不是目錄。我在這裏使用[XPath](https://en.wikipedia.org/wiki/XPath)概念。 –

回答

1

我想出了以下解決方案:

  • 搜尋字符串: [^\/]+\/[^\/]+\/([^\/]+$)

  • 替換字符串:\1

Check it here

+1

太棒了!我明白它在做什麼,但你能解釋一下它在做什麼? –

+1

當然,我們正在搜索3個部分並將它們分開,以便我們正在搜索除分隔符以外的每個字符,然後我們只捕獲最後一個字符,並用最後一部分替換整個找到的序列。 – Yaron

1

如果兩個路徑指向相同的文件/目錄,那麼你可以使用Files類。 它有一個方法Files#isSameFile您傳遞兩個Path實例,它會檢查這兩個文件是否指向您的目錄中的同一個文件。這個簡單的行將檢查A/B/E//A/B/C/D/E是否實際上是相同的目錄。

System.out.println(Files.isSameFile(Paths.get("/A/B/C/D/E"), Paths.get("/A/B/E"))); 
+0

謝謝。但請注意,我總是使用「路徑」一詞,因爲它確實是一條路徑,但我從來沒有說過「目錄」,因爲實際上,它不是。它是[XPath](https://en.wikipedia.org/wiki/XPath)。 –

+0

我沒有提到,因爲我認爲沒有什麼區別,因爲在那時我還有兩個簡單的字符串。我的問題是,由於一些複雜的原因,'/ A/B/E'實際上是指'/ A/B/C/D/E',我必須知道。 –

+0

@PatrickBard oh ok then nevermind this answer。 – SomeJavaGuy