如何用单斜杠替换双斜杠为url

12 java regex

对于像" http://google.com//view/All/builds " 这样的给定网址,我想用单斜杠替换双斜杠.例如,上面的网址应显示为" http://google.com/view/All/builds "

我知道正则表达式.任何人都可以帮助我,我怎样才能使用正则表达式实现这一点.

Lau*_*t B 21

为避免替换使用中的第一个// http://以下正则表达式:

String to = from.replaceAll("(?<!http:)//", "/");
Run Code Online (Sandbox Code Playgroud)

PS:如果你想用https (?<!(http:|https:))//来代替.

  • 替换任意数量的斜线:```.replaceAll("(?&lt;!(http:|https:))/+", "/");``` (4认同)

Chr*_*jer 12

正则表达式是正确的方法吗?

如果您希望将此解决方案作为练习的一部分来提高您的正则表达式技能,那么很好。但你真正想要达到的是什么?您可能正在尝试规范化 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();
Run Code Online (Sandbox Code Playgroud)

java.net.URL

URL inputUrl = new URL("http://localhost:1234//foo//bar//buzz");
URL normalizedUrl = inputUrl.toURI().normalize().toURL();
Run Code Online (Sandbox Code Playgroud)

java.net.URI

URI inputUri = new URI("http://localhost:1234//foo//bar//buzz");
URI normalizedUri = inputUri.normalize();
Run Code Online (Sandbox Code Playgroud)

正则表达式

如果您确实想使用正则表达式,请考虑所有可能性。如果将来这也应该处理其他协议,例如httpsfileftp、 等fish,该怎么办?所以,再想一想,可能会使用URI.normalize(). 但是如果你坚持使用正则表达式,也许可以使用这个:

String noramlizedUri = uri.replaceAll("(?<!\\w+:/?)//+", "/");
Run Code Online (Sandbox Code Playgroud)

其它解决方案相比,该作品与所有网址类似于HTTP网址,只是不同的协议,而不是httphttpsfileftp等等,它会保持三斜杠///的情况下file:///。但是,与 不同的是java.net.URI.normalize(),这不会删除多余的./,它不会../与它们的父目录折叠,它不会你和我可能忘记的 URL 规范化的其他方面,并且它不会使用关于 URL、URI 的较新的 RFC 自动更新,诸如此类。

  • 请注意,“java.net.URI”构造函数会抛出一个已检查的异常。对于您知道有效的字符串,请使用方便的静态工厂方法“java.net.URI.create”。 (3认同)

小智 5

String to = from.replaceAll("(?<!(http:|https:))[//]+", "/");
Run Code Online (Sandbox Code Playgroud)

将匹配两个或多个斜杠.