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

时间:2019-04-13 04:33:02

标签: java regex http https slash

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

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

https://stackoverflow.com转到https:/stackoverflow.com,但这不是故意的。

我做了一些研究,并想出了一个否定的含义,可以忽略之前有https:的双斜杠,但它只匹配双斜杠,而不是三斜杠或更多:

(?<!http\/\/)

我想,如果您可以否定一个“ sub”正则表达式,则可能是这样,表示匹配(双斜线或更多斜杠),但不匹配带有https:的2个斜杠。 / p>

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

这可能吗?

2 个答案:

答案 0 :(得分:1)

您想对了,但后面带有否定的外观,但您不应该将斜杠本身包括在后面。您想在所有情况下都匹配多个斜杠,但是后面的负数表示“如果前面的文本是http:,请忽略此。因此它类似于

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

查找要替换的所有斜杠。当然,您可能希望包含类似这样的其他协议,例如https:ftp:

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

答案 1 :(得分:0)

这是我在Java中的最终解决方案:

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

第二行用双斜杠替换协议后面的前三个或更多斜杠。我在(?<=...)后使用了正向后视。

第三行替换了其余的双斜杠或更多的斜杠,并将其替换为单斜杠。我在(?<!...)

后面使用了负向后看