2009-08-07 79 views
1

我正在尋找一個必須以某個前綴開頭的文件路徑的正則表達式。在這種情況下,它應該以'/ tank/home /'開頭。我也想確保它不包含'/ ..' - 不跳到父目錄。不允許父目錄的文件路徑的正則表達式

我花了一段時間擺弄,沒有提出任何正確的東西。我決定使用兩個正則表達式,它必須與第一和第二,必須不匹配:

'^/tank/home/' 

'/\.\.(/.*)?$' 

這是否做什麼我想它呢?有更容易的方法嗎?

這是在一個bash腳本中,它的價值。

+0

實際上'[^ \。\。]'不會與_any_路徑中的一個點匹配,因爲'[[ ]'是一個字符組。 – 2009-08-07 00:28:25

+0

是的,我發現後,發佈。編輯以反映這一點。 – alberge 2009-08-07 00:33:47

回答

4

您還可以擴大DAV的正則表達式包含一個額外的結尾的斜線:

^(?!.*/\.\./.*)/tank/home.*$ 

但是......一個更好的選擇是,以確保道路的結果是什麼,下/罐/家開始:

FILEPATH=$(readlink -f $YOURFILE) 
[[ $FILEPATH =~ ^/tank/home/ ]] && echo "starts with /tank/home/" 
+0

啊哈。我想知道是否有這樣做。 – alberge 2009-08-07 00:44:59

1

你可以使用負前瞻,以確保不會有字符串中的任何/..

^(?!.*/\.\..*)/tank/home.*$ 
+0

非常接近,但不完全正確。這不符合「/tank/home/..foo」。 – alberge 2009-08-07 00:29:47

+0

如果確實需要匹配..foo,那麼類似這樣的東西應該可以工作:'^(?!。*/\。\。(?:/.* | $))/ tank/home。 * $' – Amber 2009-08-07 00:34:00

+0

(基本上只能在字符串末尾加上/../或/ ..才能使先行匹配。) – Amber 2009-08-07 00:34:59

0

你可以使用負回顧後也:

/罐/家庭/([^ /] |(</..!)/)+ $

1
'^/tank/home(?!.*/\.\.(/|$))/' 

比賽/箱/家用/富..但不是/ tank/home/..或/tank/home/foo/../bar