解析URL地址的问题

ajie686 2008-05-13 12:45:24
url一般格式为:
protocol://[user[:password]@](domain_name|ip)[:port][/[path]]
例如:
ftp://test:000@192.168.0.229: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地址的,但是不对,大家帮忙看看了
...全文
742 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bt_lose 2008-05-15
  • 打赏
  • 举报
回复
csdn还可以帮大家完成作业??
shadowlin 2008-05-15
  • 打赏
  • 举报
回复
作业的话就自己想办法了呗...
ajie686 2008-05-14
  • 打赏
  • 举报
回复
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:000@192.168.0.229:1023/test/data/data.xml");
}

}这个是我们一个同学做,但是他做的台繁琐了,而我又想不出其他方法
ilrxx 2008-05-14
  • 打赏
  • 举报
回复
是啊,所以才说不能应付普遍性,我想老师的意思就是让你熟练String的两个方法,indexOf和substring,你找个测试地址试试就可以了,如果单用String类的方法就可以解决所有,那要URL干什么用?
ajie686 2008-05-13
  • 打赏
  • 举报
回复
不能用正规表达式,要用String类的方法
ajie686 2008-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ilrxx 的回复:]
public static void main(String[] args){
String Url = "ftp://test:000@192.168.0.229: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("//"), Ur…
[/Quote]

你这样如果把Url换成“http://localhost:8080/giantstone/index.jsp”就不对了
ajie686 2008-05-13
  • 打赏
  • 举报
回复
只是来练习String类的使用
ajie686 2008-05-13
  • 打赏
  • 举报
回复
这个是老师留的题目,要用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:000@192.168.0.229:1023/test/data/data.xml”
出去的结果就对了。好像必须用IF语句来判断者俩中格式的URL地址,大家看看怎么写
ilrxx 2008-05-13
  • 打赏
  • 举报
回复
我感觉这么做像神经病一样,费这么大劲,还不能针对普遍.....用URL多好,也没用正则啊
ilrxx 2008-05-13
  • 打赏
  • 举报
回复
public static void main(String[] args){
String Url = "ftp://test:000@192.168.0.229: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);
}
bruni 2008-05-13
  • 打赏
  • 举报
回复
use java.net.URL class
URL url = new URL(...);
url.getProtocol()
url.getPort()
...
ilrxx 2008-05-13
  • 打赏
  • 举报
回复
java.net.URL 看看API,这个类下面有很多方法,例如获得端口号,路径的,不知道lz为什么放着简单的不用,偏要自己去分析url,这样不便于应用啊,要是大的项目,要考虑效率的.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧