当前删除多个斜杠的代码是
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 个或更多斜杠替换为双斜杠。我用了正面的回头(?<=...)
。
第三行替换其余的双斜杠或多个斜杠,并用单斜杠替换它们。我使用了负面的后视(?<!...)