【问题标题】:Java Reguar Expression: How to replace double or more slashes with a single slash but ignoring http:// or https://Java 正则表达式:如何用单个斜杠替换双斜杠或多个斜杠但忽略 http:// 或 https://
【发布时间】:2019-09-03 20:00:27
【问题描述】:

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

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

这会将https://stackoverflow.com 转换为 https:/stackoverflow.com,这不是有意的。

我做了一些研究,并提出了否定的后视方法来忽略之前有 https: 的双斜杠,但它只匹配 双斜杠,而不是三斜杠或更多:

(?<!http\/\/)

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

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

这可能吗?

【问题讨论】:

    标签: java regex http https slash


    【解决方案1】:

    您对否定后视的想法是正确的,但您不应该将斜线本身包含在后视中。您希望在所有情况下都匹配多个斜杠,但否定的后视表示“如果前面的文本是 http:,请忽略这个。所以它会像

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

    查找要替换的所有斜线。当然,您可能希望将 https:ftp: 等其他协议包含在类似的内容中。

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

    【讨论】:

      【解决方案2】:

      这是我在 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 个或更多斜线。我使用了积极的后视(?&lt;=...)

      第三行替换其余的双斜线或多个斜线,并用单斜线替换它们。我在(?&lt;!...)

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        相关资源
        最近更新 更多