我需要一个正则表达式,用于将URL中的多个斜杠替换为单个斜杠,但排除在冒号后面的斜杠
例如,http://link.com//whatever///
将变成 http://link.com/whatever/
我需要一个正则表达式,用于将URL中的多个斜杠替换为单个斜杠,但排除在冒号后面的斜杠
例如,http://link.com//whatever///
将变成 http://link.com/whatever/
我认为这个应该有效:/[^:](\/+)/
或者 /[^:](\/\/+)/
如果你只想要多个。
它不会匹配前导的//
,但看起来你并不需要它。
要替换:
"http://test//a/b//d".replace(/([^:]\/)\/+/g, "$1") // --> http://test/a/b/d
既然您已经接受了一个答案,那么为了更好地展示匹配和控制匹配的扩展性,以下内容可能会在未来对您有所帮助:
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遍历它们一样的资源。
祝你好运!
result = subject.replace(/(?<!http:)\/*\//g, "/");
或者(对于http、https、ftp和ftps)
result = subject.replace(/(?<!(?:ht|f)tps?:)\/*\//g, "/");
原始的被接受的答案在替换方面做得足够好,但不适用于匹配。而当前被接受的答案匹配重复斜杠前面的字符,也不适合匹配。
使用负回顾后发排除协议的匹配(?<!:)
,和花括号量词匹配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, '/'));
/([^:])\/\/+/g
就足够了。 - Halcyon