url一般格式为:
    protocol://[user[:password]@](domain_name|ip)[:port][/[path]]
例如:
    ftp://test:[email protected]:1023/test/data/data.xml
    http://localhost:8080/giantstone/index.jsp
请编写函数parseUrl,将url解析成各个域打印出来:
    public static void parseUrl(String url)
注:要求用String类的方法实现,不得采用正则表达式
我写了用import java.util.regex.Pattern;
import java.util.regex.Matcher;来解析URL地址的,但是不对,大家帮忙看看了

解决方案 »

  1.   

    use java.net.URL class
    URL url = new URL(...);
    url.getProtocol()
    url.getPort()
    ...
      

  2.   

    不能用正规表达式,要用String类的方法
      

  3.   

    java.net.URL 看看API,这个类下面有很多方法,例如获得端口号,路径的,不知道lz为什么放着简单的不用,偏要自己去分析url,这样不便于应用啊,要是大的项目,要考虑效率的.
      

  4.   

         public static void main(String[] args){
          String Url = "ftp://test:[email protected]:1023/test/data/data.xml";
          String protocol = "";
          String user = "";
          String password = "";
          String ip = "";
          String port = "";
          String path = "";
          
          protocol = Url.substring(0, Url.indexOf(":"));
          user = Url.substring(Url.indexOf("//"), Url.indexOf("@"));
          user = user.substring(user.indexOf("//"), user.indexOf(":")).replace("//", "");
          password = Url.substring(Url.indexOf("//"), Url.indexOf("@"));
          password = password.substring(password.indexOf(":"), password.length()).replace(":","");
          ip = Url.substring(Url.indexOf("@"), Url.lastIndexOf(":")).replace("@", "");
          port = Url.substring(Url.lastIndexOf(":"), Url.length());
          port = port.substring(port.indexOf(":"),port.indexOf("/")).replace(":", "");
          path = Url.substring(Url.lastIndexOf(":"), Url.length());
          path = path.substring(path.indexOf("/"), path.length());
          System.out.println(protocol);
          System.out.println(user);
          System.out.println(password);
          System.out.println(ip);
          System.out.println(port);
          System.out.println(path);
         }
      

  5.   

    我感觉这么做像神经病一样,费这么大劲,还不能针对普遍.....用URL多好,也没用正则啊
      

  6.   

    这个是老师留的题目,要用String类来解析URL
    public class StringTest{
     public static void main(String[] args){
      String url = "http://localhost:8080/giantstone/index.jsp";
      StringTest.parseUrl(url);
     }
     
     public static void parseUrl(String value){ 
      String val;
      val = value.substring(0,value.indexOf("/")-1);
      System.out.println("Protocal: " +val);
      int startIndex = value.indexOf("/")+2;
      int endIndex = value.indexOf(":",startIndex);
      val = value.substring(startIndex,endIndex);
      System.out.println("User: " +val);
      
      startIndex = endIndex+1;
      endIndex = value.indexOf("/",startIndex);
      val = value.substring(startIndex,endIndex);
      System.out.println("Port: " +val);
      
      String[] vals = value.split("/");
      startIndex = endIndex+1;
      endIndex = value.indexOf("/",startIndex);
      val = value.substring(startIndex,endIndex);
      System.out.println("Path: /" +val+"/"+vals[vals.length-1]);
      
      startIndex = endIndex;
      endIndex = value.lastIndexOf("/");
      val = value.substring(startIndex,endIndex);
      System.out.println("Request File Dir: " +val);}}
    这样得出的结果是对的,但是如果把传入的字符串改为“ftp://test:[email protected]:1023/test/data/data.xml”
    出去的结果就对了。好像必须用IF语句来判断者俩中格式的URL地址,大家看看怎么写
      

  7.   


    你这样如果把Url换成“http://localhost:8080/giantstone/index.jsp”就不对了
      

  8.   

    是啊,所以才说不能应付普遍性,我想老师的意思就是让你熟练String的两个方法,indexOf和substring,你找个测试地址试试就可以了,如果单用String类的方法就可以解决所有,那要URL干什么用?
      

  9.   

    import java.util.*;
    import java.io.*;public class MyString { //(2)编写函数parseUrl,将url解析成各个域打印出来
    public static void parseUrl(String url) {
    int q = 0;// 记录用
    int i;
    int iLast = 0;// 用来记录上一个位置
    for (i = 0; i < url.length(); i++) {
    if (url.charAt(i) == ':')// 如果找到第一个冒号,则打印之前内容
    {
    if (q == 0) {
    System.out.println("protocol[" + url.substring(0, i) + "]");// 打印输出protocol
    q++;
    } else if (q == 1) {
    System.out.println("user[" + url.substring(iLast + 1, i)
    + "]");// 打印输出user
    q++;
    } else if (q == 2) {
    // 还需判断这部分是domain_name还是ip,要求用String类的方法实现,不得采用正则表达式
    String s = url.substring(iLast + 1, i);
    if (isIPV4(s)) {
    System.out.println("ip[" + s + "]");// 打印输出ip
    } else {
    System.out.println("domain_name[" + s + "]");// 打印输出domain_name
    }
    q++;
    }
    iLast = i;
    } else if (url.charAt(i) == '@') {
    System.out.println("password[" + url.substring(iLast + 1, i)
    + "]");// 打印输出password
    iLast = i;
    } else if (url.charAt(i) == '/') {
    if ((url.charAt(i - 1) != '/') && (url.charAt(i + 1) != '/')) {
    System.out.println("port[" + url.substring(iLast + 1, i)
    + "]");// 打印输出port
    break;// 跳出循环
    }
    iLast = i;
    }
    }
    // 最后输出path
    System.out.println("path[" + url.substring(i + 1) + "]");// 打印输出path
    }
    //判断(2)中是domain_name|ip?
    public static boolean isIPV4(String s) {
    try {
    String number = s.substring(0, s.indexOf('.'));
    if (Integer.parseInt(number) > 255)
    return false;
    s = s.substring(s.indexOf('.') + 1);
    number = s.substring(0, s.indexOf('.'));
    if (Integer.parseInt(number) > 255)
    return false;
    s = s.substring(s.indexOf('.') + 1);
    number = s.substring(0, s.indexOf('.'));
    if (Integer.parseInt(number) > 255)
    return false;
    number = s.substring(s.indexOf('.') + 1);
    if (Integer.parseInt(number) > 255)
    return false;
    return true;
    } catch (Exception e) {
    return false;
    }
    }
    public static void main(String[] args) {

    MyString.parseUrl("ftp://test:[email protected]:1023/test/data/data.xml");
    }}这个是我们一个同学做,但是他做的台繁琐了,而我又想不出其他方法
      

  10.   

    csdn还可以帮大家完成作业??