代码之家  ›  专栏  ›  技术社区  ›  fall

Java正则表达式:如何用单斜杠替换双斜杠或多斜杠,但忽略http://或https://

  •  1
  • fall  · 技术社区  · 5 年前

    删除多个斜杠的当前代码是

    path = path.replaceAll("/{2,}", "/");
    

    哪个转弯 https://stackoverflow.com 到https:/stackoverflow。com,而这并非本意。

    我做了一些研究,提出了一个负面的回顾,可以忽略已经出现的双斜线 https: 以前,但它只匹配 双斜杠 ,而不是三重斜杠或更多:

    (?<!http\/\/)
    

    我想如果你能否定一个“sub”正则表达式,它可能是这样的,意思是匹配( 双斜杠或多斜杠 )但不匹配有https:ahead的两个斜杠。

    \/{2,}.negate(https:(?=\/\/))
    

    这可能吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Dawood ibn Kareem    5 年前

    你对消极的回顾有正确的想法,但是你不应该在回顾中包含斜线本身。您希望在所有情况下都匹配多个斜杠,但反向查找会显示“如果前面的文本是 http: .所以应该是这样的

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

    查找所有要替换的斜杠。当然,您可能希望包括其他协议,如 https: ftp: 用这样的东西。

    (?<!(http:|https:|ftp:))/{2,}
    
        2
  •  0
  •   fall    5 年前

    以下是我在java中的最终解决方案:

    String path = "http:///baidu.com///a//b/c";
    path = path.replaceFirst("(?=(http:|https:|ftp:))/{3,}", "/{2}");
    path = path.replaceAll("(?<!(http:|https:|ftp:))/{2,}", "/");
    

    第二行用双斜杠替换协议后面的前3个或更多斜杠。我用了积极的回头看 (?<=...) .

    第三行替换其余的双斜杠或多斜杠,并将其替换为单斜杠。我用了消极的回头看 (?<!...)