2014-01-15 2 views
1

Получая строку, как https://xxxxxxxxxx.cloudfront.net/dir1/dir2/file.ext я хотел бы получить dir2Match подкаталог

У меня есть это регулярное выражение: /(\.net\/)([^\/]*)/, но это только дает мне возможность получить с группами захвата dir1

Как я могу изменить это, чтобы соответствовать dir2 ?

Я использую регулярное выражение для замены строки за один шаг.

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

Так что я не хочу, чтобы просто извлечь dir2. Я хочу, чтобы мое регулярное выражение соответствовало ему. так что я могу его заменить.

+0

Вы хотите второй каталог или последний каталог? – Barmar

+0

@Barmar последний каталог – Houseman

+0

Кажется, что все здесь вас не так, поэтому, может быть, вы могли бы представить пример ожидаемого вывода, чтобы сделать вещи более ясными? –

ответ

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

Группа захвата 1 будет последним каталогом на пути.

Если вы хотите заменить dir2, а не извлекать его, ваши группы захвата должны быть все кроме что реж:

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-адрес, см. Приложение B RFC 3986. –

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

достаточно просто с чистым RegEx: [^/]+(?=/[^/]+$)

побег / так как вы используете его в качестве разделителя.

0

Другое возможное решение:

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

fiddle

+0

Я не хочу просто получить каталог. Я хочу сопоставить его с регулярным выражением, поэтому я могу использовать его в 'replace' – Houseman

Смежные вопросы