对于给定的URL,例如“http://google.com//view/All/builds”,我希望将双斜杠替换为单斜杠。例如,上面的URL应该显示为“http://google.com/view/All/builds”。
我不懂正则表达式。有人能帮助我吗?如何使用正则表达式实现这一目标。
对于给定的URL,例如“http://google.com//view/All/builds”,我希望将双斜杠替换为单斜杠。例如,上面的URL应该显示为“http://google.com/view/All/builds”。
我不懂正则表达式。有人能帮助我吗?如何使用正则表达式实现这一目标。
http://
中的第一个 //,使用以下正则表达式:String to = from.replaceAll("(?<!http:)//", "/");
PS:如果您想处理HTTPS,请使用(?<!(http:|https:))//
。
.replaceAll("(?<!(http:|https:))/+", "/");
- bhelm如果您希望将此解决方案作为提高正则表达式技能的练习的一部分,那很好。但您真正想要实现什么?您可能正在尝试规范化URL。用//
替换/
是规范化URL的一个方面。但其他方面呢?例如删除多余的./
并将../
与其父目录合并在一起?不同的协议呢?///
怎么办?以及开头的//
呢?文件协议的情况下,file:///
开头的///
呢?
如果您想编写通用的可重用代码,则使用正则表达式可能不是最佳方法。这是重新发明轮子。相反,请考虑使用java.net.URI.normalize()
。
java.net.URI.normalize()
java.lang.String
String inputUrl = "http://localhost:1234//foo//bar//buzz";
String normalizedUrl = new URI(inputUrl).normalize().toString();
java.net.URL
URL inputUrl = new URL("http://localhost:1234//foo//bar//buzz");
URL normalizedUrl = inputUrl.toURI().normalize().toURL();
java.net.URI
URI inputUri = new URI("http://localhost:1234//foo//bar//buzz");
URI normalizedUri = inputUri.normalize();
如果你确实需要使用正则表达式,请考虑所有可能性。如果将来这也应该处理其他协议,如https
、file
、ftp
、fish
等等,那么怎么办呢?所以,请再次考虑,并可能使用URI.normalize()
。但是,如果你坚持要使用正则表达式,也许可以使用这个:
String noramlizedUri = uri.replaceAll("(?<!\\w+:/?)//+", "/");
与其他解决方案相比,此解决方案适用于所有类似于HTTP URL但使用不同协议的URL,如https
,file
,ftp
等,并且在file:///
的情况下保留三个斜杠///
。但是,与java.net.URI.normalize()
不同的是,它不会删除冗余的./
,也不会将../
与其父目录合并,也不会处理URL标准化的其他方面,而我们可能已经忘记了,它也不会自动更新新的有关URL、URI和类似事项的RFC。java.net.URI
构造函数会抛出一个已检查的异常。对于那些您知道是有效的字符串,请改用方便的静态工厂方法 java.net.URI.create
。 - haisiString to = from.replaceAll("(?<!(http:|https:))[//]+", "/");
将匹配两个或更多的斜杠。
foo////bar
将变成foo/bar
,但foo///bar
将变成foo//bar
。 - Christian Hujer这里是正则表达式:
/(?<=[^:\s])(\/+\/)/g
它能够找到URL中的多个斜杠,无论协议如何,在协议后面保留斜杠。
同时处理以 //
开头的协议相对URL。
@Test
public void shouldReplaceMultipleSlashes() {
assertEquals("http://google.com/?q=hi", replaceMultipleSlashes("http://google.com///?q=hi"));
assertEquals("https://google.com/?q=hi", replaceMultipleSlashes("https:////google.com//?q=hi"));
assertEquals("//somecdn.com/foo/", replaceMultipleSlashes("//somecdn.com/foo///"));
}
private static String replaceMultipleSlashes(String url) {
return url.replaceAll("(?<=[^:\\s])(\\/+\\/)", "/");
}
(\/+\/)
- 查找组:/+
一个或多个斜杠后跟 /
斜杠(?<=[^:\s])
- 跟随该组的位置 (*积极回顾) 的这个 (*否定集合) [^:\s]
,不包括冒号 :
和空格 \s
g
- 全局搜索标志(?<=[^:\s])(/+/)
。 - Fraser