2014-01-15 169 views
1

鑑於像https://xxxxxxxxxx.cloudfront.net/dir1/dir2/file.ext字符串我想獲得dir2匹配子目錄

我有這樣的正則表達式:/(\.net\/)([^\/]*)/,但這隻能使我得到與捕獲組dir1

我怎麼能修改此相匹配dir2

我正在使用正則表達式在一個步驟中替換字符串。

.replace(/(\.net\/)([^\/]*)/,'$1'+'newfilename'

所以我不想僅僅提取dir2。我想我的正則表達式匹配它。以便我可以取代它。

+0

你想第二個目錄或最後一個目錄? – Barmar

+0

@Barmar最後一個目錄 – Houseman

+0

看來每個人都會在這裏弄錯你的,所以也許你可以提供一個預期輸出的例子來使事情更清晰? –

回答

1
/.*\/([^\/]+)\/[^\/]*$/ 

捕獲組1將是路徑中的最後一個目錄。

如果你想更換dir2而不是提取它,你的捕捉組應該是一切除了是DIR:

str.replace(/(.*\/)[^/]+(\/[^\/]*)$/, '$1test$2'); 

> str = 'https://xxxxxxxxxx.cloudfront.net/dir1/dir2/file.ext' 
> str.replace(/(.*\/)[^/]+(\/[^\/]*)$/, '$1test$2'); 
"https://xxxxxxxxxx.cloudfront.net/dir1/test/file.ext" 
+0

如果存在包含'/'的查詢或片段,也不會工作。 –

+0

當我將它插入'replace'函數時,它似乎殺死了我的整個字符串。 – Houseman

+0

當我寫回答時,問題中沒有'替換'。我以爲你想得到'dir2',而不是取代它。 – Barmar

0

使用URI.js得到的路徑,然後用.directory()讓你的目錄想。

+0

我不只是想獲得目錄。我想用正則表達式匹配它。 – Houseman

+0

@Houseman,URI庫允許你通過傳遞參數到'directory(...)'來修改路徑。如果你真的想要一個正則表達式來處理一個URL,請參閱RFC 3986的附錄B. –

1

男人,真正的挑戰在於理解你真正想要什麼。

所以,如果我理解正確的話:

input xxxxx/a/b 
output xxxxx/a/test 

input xxxxx/a/b/file.xyz 
output xxxxx/a/test/file.xyz 

我想你考慮 ''作爲文件名稱的指示符。

如果這是你想要的東西,這是一種方式來獲得它:

function change_last_dir (str, new_dir) 
{ 
    var split = str.split ('/'); 
    var pos = (split[split.length-1].indexOf ('.') < 0) ? -1 : -2; 
    split.splice (pos, 1, new_dir); 
    return split.join('/'); 
} 
+0

我不是隻想獲取目錄。我想用正則表達式匹配它。 – Houseman

+0

如果你給我們一個輸入***和***輸出的例子,那會更容易。或者你是否有正則表達式? –

0

純正則表達式很容易:[^/]+(?=/[^/]+$)

逃生/,因爲你使用它作爲您的分隔符。

0

另一種可能的解決方案:

var subDirs = url.split('/').slice(-2, -1); 

fiddle

+0

我不想只是得到目錄。我想用正則表達式來匹配它,所以我可以在'replace'中使用 – Houseman