2014-01-15 181 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