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



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

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

这 https://stackoverflow.com 转向https:/stackoverflow.com这不是故意的。

我做了一些研究,并提出了负面的后视,以忽略以前https:的双斜杠,但它只匹配双斜杠,而不是三斜杠或更多:

(?<!http//)

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

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

这可能吗?

你对

负后视有正确的想法,但你不应该在后视中包含斜杠本身。 您希望在所有情况下都匹配多个斜杠,但否定的后视显示"如果前面的文本http:,请忽略此内容。 所以它会像

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

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

(?<!(http:|https:|ftp:))/{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 个或更多斜杠替换为双斜杠。我用了正面的回头(?<=...)

第三行替换其余的双斜杠或多个斜杠,并用单斜杠替换它们。我使用了负面的后视(?<!...)

最新更新