匹配URL中多个正斜杠的正则表达式

17

我需要一个正则表达式,用于将URL中的多个斜杠替换为单个斜杠,但排除在冒号后面的斜杠

例如,http://link.com//whatever/// 将变成 http://link.com/whatever/

4个回答

38

我认为这个应该有效:/[^:](\/+)/ 或者 /[^:](\/\/+)/ 如果你只想要多个

它不会匹配前导的//,但看起来你并不需要它。

要替换:

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

演示链接


当我尝试用单个正斜杠替换匹配项时,第一个返回http:/link.co/whateve/,第二个返回ttp://link.co/whateve/。由于某种原因,它会删除第一个前导字符。 - geochr
哦,你想要“替换”它们,而不仅仅是“匹配”它们?这是一个重要的区别。 - Halcyon
@JeffShaver 不是的:它会删除一些字符。 - Denys Séguret
@dystroy 是的,刚看到了。 - Jeff Shaver
2
在你的正则表达式中,你不需要第二个匹配组:/([^:])\/\/+/g就足够了。 - Halcyon
显示剩余2条评论

2

既然您已经接受了一个答案,那么为了更好地展示匹配和控制匹配的扩展性,以下内容可能会在未来对您有所帮助:

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遍历它们一样的资源。

祝你好运!


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

或者(对于http、https、ftp和ftps)

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

原问题并未涉及更换计划,因此此答案与其无关。 - codeadventurer
@codeadventurer,这个正则表达式没有替换方案。这个回答是相关的。 - Andrew Dibble

0

原始的被接受的答案在替换方面做得足够好,但不适用于匹配。而当前被接受的答案匹配重复斜杠前面的字符,也不适合匹配。

使用负回顾后发排除协议的匹配(?<!:),和花括号量词匹配2到无限个斜杠\/{2,}既可以匹配又可以替换。

(?<!:)\/{2,}

let str = 'https://test.example.com:8080//this/is//an/exmaple///';
document.write('Original: ' + str + '<br><br>');
document.write('Matches: ' + str.match(/(?<!:)\/{2,}/g) + '<br><br>');
document.write('Replaced: ' + str.replace(/(?<!:)\/{2,}/g, '/'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接