Regex для сопоставления нескольких косых черт в URL-адресе

Мне нужно регулярное выражение для замены нескольких косую черту в URL с одной косой чертой, исключая те, которые следуют за двоеточием

например. http://link.com//whatever/// станет http://link.com/whatever/

Ответ 1

Как вы уже приняли ответ. Чтобы показать еще больше возможностей совпадения и контроля совпадений, это может помочь вам в будущем:

var url = 'http://link.com//whatever///';
var set = url.match(/([^:]\/{2,3})/g); // Match (NOT ":") followed by (2 OR 3 "/")

for (var str in set) {
    // Modify the data you have
    var replace_with = set[str].substr(0, 1) + '/';

    // Replace the match
    url = url.replace(set[str], replace_with);
}

console.log(url);

Будет выводиться:

http://link.com/whatever/

Двойной удар не будет иметь значения в вашей ситуации. Если у вас есть эта строка:

var url = 'http://link.com//om/om/om/om/om///';

Ваш массив set будет содержать несколько m//. Немного избыточно, поскольку цикл увидит эту переменную несколько раз. Приятно, что String.replace() ничего не заменяет, если ничего не находит, поэтому никакого вреда не было.

Что бы вы могли сделать, сначала удалите дубликаты из set, но это почти потребует того же объема ресурсов, что и просто для того, чтобы цикл for-loop прошел через них.

Удачи!

Ответ 2

Я думаю, что это должно работать: /[^:](\/+)/ или /[^:](\/\/+)/, если вы хотите только кратные.

Он не будет соответствовать ведущему //, но похоже, что вы этого не ищете.

Для замены:

"http://test//a/b//d".replace(/([^:]\/)\/+/g, "$1") // -->  http://test/a/b/d

Рабочий демонстрационный пример

Ответ 3

result = subject.replace(/(?<!http:)\/*\//g, "/");

или (для http, https, ftp и ftps)

result = subject.replace(/(?<!(?:ht|f)tps?:)\/*\//g, "/");