【问题标题】:Regex for matching multiple forward slashes in URL用于匹配 URL 中的多个正斜杠的正则表达式
【发布时间】:2013-03-26 13:21:23
【问题描述】:

我需要一个正则表达式来用一个正斜杠替换 URL 中的多个正斜杠,不包括冒号后面的那些

例如http://link.com//whatever/// 将变为 http://link.com/whatever/

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    我认为这应该可行:/[^:](\/+)//[^:](\/\/+)/ 如果您只想要倍数

    它不会匹配领先的 //,但看起来你不是在寻找那个。

    替换:

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

    Working Demo

    【讨论】:

    • 当我尝试用单个正斜杠替换匹配项时,他的第一个返回 http:/link.co/whateve/ 和第二个 ttp://link.co/whateve/ 。出于某种原因,它会删除前面的第一个字符。
    • 哦,您想替换它们,而不仅仅是匹配它们吗?这是一个重要的区别。
    • @JeffShaver no : 它删除了一些字符
    • @dystroy 是的,刚刚看到
    • 在你的正则表达式中你不需要第二个匹配组:/([^:])\/\/+/g 就足够了
    【解决方案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 循环遍历它们相同数量的资源。

    祝你好运!

    【讨论】:

      【解决方案3】:
      result = subject.replace(/(?<!http:)\/*\//g, "/");
      

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

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

      【讨论】:

      • 原来的问题没有问任何关于替换方案的问题。这个答案不相关。
      • @codeadventurer,这个正则表达式不会取代这个方案。这个答案是相关的。
      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2013-05-15
      • 2015-03-15
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多