当前删除多个斜杠的代码是
path = path.replaceAll("/{2,}", "/");
将https://stackoverflow.com转到https:/stackoverflow.com,但这不是故意的。
我做了一些研究,并想出了一个否定的含义,可以忽略之前有https:
的双斜杠,但它只匹配双斜杠,而不是三斜杠或更多:
(?<!http\/\/)
我想,如果您可以否定一个“ sub”正则表达式,则可能是这样,表示匹配(双斜线或更多斜杠),但不匹配带有https:的2个斜杠。 / p>
\/{2,}.negate(https:(?=\/\/))
这可能吗?
答案 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,}", "/");
第二行用双斜杠替换协议后面的前三个或更多斜杠。我在(?<=...)
后使用了正向后视。
第三行替换了其余的双斜杠或更多的斜杠,并将其替换为单斜杠。我在(?<!...)