对于像“http://google.com//view/All/builds”这样的给定网址,我想用单斜杠替换双斜杠。例如,上面的网址应显示为“http://google.com/view/All/builds”
我知道正则表达式。任何人都可以帮助我,我怎样才能使用正则表达式实现这一点。
答案 0 :(得分:21)
要避免替换http://
中的第一个//使用以下正则表达式:
String to = from.replaceAll("(?<!http:)//", "/");
PS:如果你想处理https,请使用(?<!(http:|https:))//
。
答案 1 :(得分:5)
String to = from.replaceAll("(?<!(http:|https:))[//]+", "/");
将匹配两个或更多斜杠。
答案 2 :(得分:5)
如果您希望将此解决方案作为练习的一部分来提高您的正则表达式技能,则可以。但是,您真正要实现的目标是什么?您可能正在尝试标准化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,只是使用不同的协议而不是http
,例如https
,file
,ftp
和等等,并且在///
的情况下,它将保留三斜杠file:///
。但是,与java.net.URI.normalize()
不同的是,这不会删除多余的./
,不会折叠../
的父目录,也不会像您和我可能忘记的URL标准化的其他方面,并且不会使用有关URL,URI等的新RFC自动更新。
答案 3 :(得分:2)
这是正则表达式:
/(?<=[^:\s])(\/+\/)/g
它会在协议之后找到多个斜杠,保留协议,无论它如何
处理从//
开始的协议相对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])
- 该(* posiive lookbehind)的(* posiive lookbehind) (* negated set) [^:\s]
排除了{{1}冒号和:
空格\s
- 全局搜索标记答案 4 :(得分:1)
我建议您只使用String.replace,哪个文档是http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace(java.lang.CharSequence,java.lang.CharSequence)
喜欢的东西 `myString.replace(“//”,“/”);
如果你想删除第一次出现:
String[] parts = str.split("//", 2);
str = parts[0] + "//" + parts[1].replaceAll("//", "/");
哪种方法最简单(没有正则表达式)。我不知道正则表达式对应,如果有专家在看线程....;)