2011-04-06 150 views

回答

30

你想是这样的:

String path = new URL("http://www.costo.com/test1/test2").getPath(); 

其实这会给你/test1/test2。你只需要删除第一/得到你想要的东西:

path = path.replaceFirst("/", ""); 

现在,您可以pathtest1/test2

+2

的人感觉这个尝试后哑,请注意,这不是JavaScript代码。这是java – 2017-08-01 20:15:11

4
URL url = new URL("http://www.google.com/in/on"); 
System.out.println(url.getPath()); 

另请参见

2

使用URL类的URL.getPath()方法。

1

你可以这样做:

URL url = new URL("http://www.costo.com/test1/test2"); 
    System.out.println(url.getPath()); 
4

我不得不使用Java URL类从URL只是提取路径性能的怀疑和认为这是矫枉过正。

因此我写了三种方法,它们都使用不同的方式从给定的URL中提取路径。

  1. 第1种方法使用来自Java URL类的URL.getPath方法。
  2. 第二种方法使用正则表达式我在SO中找到了(我失去了源代码链接,否则我会在这里给作者点数)。
  3. 第三种方法使用数组拆分并加入获得相同的结果。

对于给定的URL,所有这三种方法都会被调用1000000次。

结果是:

#1 (getPathviaURL) took: 860ms 
#2 (getPathViaRegex) took: 3763ms 
#3 (getPathViaSplit) took: 1365ms 

代码 - 随意进行优化:

public static void main(String[] args) { 


     String host = "http://stackoverflow.com/questions/5564998/how-to-get-the-path-of-a-url"; 

     long start1 = System.currentTimeMillis(); 
     int i = 0; 
     while (i < 1000000) { 
      getPathviaURL(host); 
      i++; 
     } 
     long end1 = System.currentTimeMillis(); 

     System.out.println("#1 (getPathviaURL) took: " + (end1 - start1) + "ms"); 
     Pattern p = Pattern.compile("(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?"); 

     long start2 = System.currentTimeMillis(); 
     int i2 = 0; 
     while (i2 < 1000000) { 
      getPathViaRegex(host, p); 
      i2++; 
     } 
     long end2 = System.currentTimeMillis(); 
     System.out.println("#2 (getPathViaRegex) Took: " + (end2 - start2) + "ms"); 

     long start3 = System.currentTimeMillis(); 
     int i3 = 0; 
     while (i3 < 1000000) { 
      getPathViaSplit(host); 
      i3++; 
     } 
     long end3 = System.currentTimeMillis(); 
     System.out.println("#3 (getPathViaSplit) took: " + (end3 - start3) + "ms"); 



    } 

    public static String getPathviaURL(String url) { 
     String path = null; 
     try { 
      path = new URL(url).getPath(); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return path; 
    } 

    public static String getPathViaRegex(String url, Pattern p) { 
     Matcher m = p.matcher(url); 

     if (m.find()) { 
      return m.group(3); 
     } 
     return null; 
    } 

    public static String getPathViaSplit(String url) { 
     String[] parts = url.split("/"); 

     parts = Arrays.copyOfRange(parts, 3, parts.length); 
     String joined = "/" + StringUtils.join(parts, "/"); 

     return joined; 
    } 
+0

切勿使用'System.currentTimeMillis()'进行微基准测试。使用nano,这更准确。请记住,这不是一个真正的基准测试,我强烈建议使用基准测试工具,http://openjdk.java.net/projects/code-tools/jmh/ – Panthro 2017-08-25 11:50:54