正则表达式求助:替换多斜杠//+为单斜杠且保留https://
如何保留
https://并替换URL中其他连续多斜杠为单斜杠? 这个问题很常见,我来帮你解决~先看你的场景:你想把URL里除了https://之外的连续多斜杠换成单个,但之前的正则会误改https://,尝试的正则语法也不对,下面给你两个可行的解决方案:
方法一:使用负向回顾断言(现代环境推荐)
ES2018及以上的JavaScript支持负向回顾断言,能精准避开https://里的斜杠。你需要的正则是:/(?<!https:)\/{2,}/g
拆解下这个正则的逻辑:
(?<!https:):这是负向回顾断言,意思是当前要匹配的连续斜杠,前面不能是https:(完美避开https://里的两个斜杠)\/{2,}:匹配连续2个及以上的斜杠g:全局匹配标记,确保替换所有符合条件的部分
把这个正则套进你的代码里:
var test = "https://test.com///?abc=def//&test=1e"; console.log(test.replace(/(?<!https:)\/{2,}/g, '/')); // 输出结果:https://test.com/?abc=def/&test=1e
这样既保留了https://的格式,又把其他地方的///、//都替换成了单个/。
方法二:临时标记法(兼容旧环境)
如果你的代码要运行在不支持负向回顾断言的旧版浏览器/环境中,可以用「临时替换+恢复」的思路:
- 先把
https://替换成一个不会在URL中出现的临时标记 - 替换所有连续多斜杠为单个
- 最后把临时标记恢复成
https://
代码示例:
var test = "https://test.com///?abc=def//&test=1e"; // 第一步:替换https://为临时标记 var tempStr = test.replace(/https:\/\//g, 'TEMP_HTTPS_MARKER'); // 第二步:替换所有连续斜杠 tempStr = tempStr.replace(/\/{2,}/g, '/'); // 第三步:恢复https:// var result = tempStr.replace(/TEMP_HTTPS_MARKER/g, 'https://'); console.log(result); // 输出同样是:https://test.com/?abc=def/&test=1e
这个方法兼容性拉满,适合所有JavaScript运行环境。
顺便说下你之前的问题出在哪:
- 第一个正则
/[\/{2,}]+/g有语法错误:[\/{2,}]是字符集,会匹配/、{、2、}这些单个字符,而不是连续的斜杠;就算改写成\/{2,},它还是会匹配https://里的两个斜杠,导致变成https:/。 - 你尝试的
(!:)[/{2,}]+语法不对,负向回顾断言的正确写法是(?<!...),所以这个正则根本不会生效。
内容的提问来源于stack exchange,提问作者Expert wanna be
相关产品推荐
相关产品推荐

