【问题标题】:Truncate Domain From URL using Java使用 Java 从 URL 中截断域
【发布时间】:2014-12-30 11:32:52
【问题描述】:

给定这样一个域:

http%3a%2f%2fwww.google.com%2fpagead%2fconversion%2f1001680686%2f%3flabel%3d4dahCKKczAYQrt7R3QM%26value%3d%26muid%3d_0RQqV8nf-ENh3b4qRJuXQ%26bundleid%3dcom.google.android.youtube%26appversion%3d5.10

我想换

%3a%2f%2

://

去掉“.com”后面的所有内容,所以最后我只想得到

http://www.google.com

如何使用正则表达式在 Java 中实现这一点?

【问题讨论】:

标签: java regex url


【解决方案1】:

你可以使用:

String u = URLDecoder.decode(url, "UTF-8").replaceFirst("(\\.[^/]+).*$", "$1");
// http://www.google.com

【讨论】:

  • 使用方法时,它适用于大多数URL,但是我有一个结果,但我有一个结果:“http \://nfl.demdex.net/event?d_uuid = 7891237817&d_dpid = 1327&d_dpuid = 2a0532a8和d_ptfm =android&d_dst=1&d_rtbd=json"。我想我应该只有“nfl.demdex.net”,对吧?有什么问题?有什么可以改进或修改的吗?
  • 是的,现在试试我的答案。
  • 这看起来很不错。你能简单解释一下你的答案吗?之后我会接受这个答案,谢谢。
  • 是的,当然。此正则表达式使用\\. 找到第一个点,然后使用否定正则表达式[^/]+ 它匹配文本,直到遇到斜线/(\\.[^/]+) 正在捕获的组 #1 中捕获此内容,.*$ 匹配所有内容,直到 URL 结束。在替换部分中,我们只是为捕获的组 #1 提供了一个反向引用 $1,从而给了我们 http://nfl.demdex.net 并丢弃了其余部分。
  • 如果我得到这样的url怎么办:解码后变成:www.google.com:80/other part...我也不想要端口信息(:80),怎么可能我对此进行更改? @anubhava
【解决方案2】:

所以你在解码后就有了这个方案的 URL(例如java.net.URLDecoder.decode()):

http://www.google.com/here/is/some/content

要从输入中获取域和协议,您可以使用如下正则表达式:

String input = URLDecoder.decode("http%3a%2f%2fwww.google.com%2fpagead%2fconversion%2f1001680686%2f%3flabel%3d4dahCKKczAYQrt7R3QM%26value%3d%26muid%3d_0RQqV8nf-ENh3b4qRJuXQ%26bundleid%3dcom.google.android.youtube%26appversion%3d5.10");
Matcher m = Pattern.compile("(http[s]?)://([^/]+)(/.*)?").matcher(input);
if (!m.matches()) return;
String protocol = m.group(1);
String domain   = m.group(2);
System.out.println(protocol + "://" + domain);

正则表达式的解释:

(http[s]?)://([^/]+)(/.*)?
|---1----|-2-|--3--|--4---|
  1. 匹配协议httphttps
  2. 匹配协议后面的://
  3. 匹配域名([^/]+ 是任何不包含斜杠的字符串)
  4. 匹配域后面的所有内容(必须以斜杠开头)

【讨论】:

  • 我只是在说明您正在使用已弃用的版本URLDecoder.decode(String) ...
  • @Tom 我链接到 JavaDoc,所以我知道这已被弃用。如果您知道编码是什么,请随时添加它
【解决方案3】:

一种方式;

java.net.URI uri = new java.net.URI(java.net.URLDecoder.decode(url, "UTF-8"));

System.out.println( uri.getScheme() + "://" + uri.getHost() );

【讨论】:

  • 既然 OP 添加了正则表达式标签,我认为他想要一个解决问题的正则表达式
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多