当前位置:编程学习 > JAVA >>

一道关于改写url的题

昨天在这边请教了大神们后,收益匪浅~感觉一道题学会了好多东西。
所以我又来了,想和大家讨论一下。不是很难的题目,因为是原文是英语,我可能翻译有错误的地方,请多包涵。

你是一个http服务器,但你只负责过滤和转发请求到你的应用服务器上。这意味着你得转换url
请改写url遵循以下规则:
1)/member/$1 变为 member?id=$1
  - /member/250 变为 /member?id=250
  - $1 只可能是一个数字

2)/school/$1/$2 变为 /school?state=$1&city=$2
  - $2 可以为空
  - /school/ar/jonesboro 变为 /school?state=ar&city=jonesboro

3) 如果以上两条没有碰到,返回原地址就可以了
以下的interface可帮助你开始

/**
 * Rewrite an incoming URL
 *
 * @param url   requested URL
 * @return      rewritten URL
 */


看完题目后,我首先纠结的是我是不是要写一个server还是一个简单的string转换程序。其次纠结的就是java 的main return type只能是void,那我要怎么return 改好后的url呢?
结果我写的程序就是通过args把url拿进来,用'/'split后,很傻瓜的把该改的改好,重新拼回去,然后打出来。
我原本想通过 pattern 和 matcher 来直接replace上述条件中的string,但是虽然正则表达式可以做到搜索"member/"+""-?\\d+(\\.\\d+)?"但是我却找不到只替换"member/"为"member?id="而保持其后数字不变的方法。如果把"member/"+""-?\\d+(\\.\\d+)?"放到一个buffer里再在这个buffer里找到member/再替换,感觉好像不是很值得。


/**
 * Rewrite an incoming URL
 *
 * @param url   requested URL
 * @return      rewritten URL
 */

package main;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class rewrite {
public static void main(String[] args) {
String url = args[0];
String reurl = "";
if(url.charAt(0)=='/')
{
reurl="/";
}


String[] result = url.split("/");
int i=0;
 for(String s : result){
  if(result[i].equals("member") && result[i+1].matches("-?\\d+(\\.\\d+)?"))
  {
  result[i]="member?id=";
  }
  else if(result[i].equals("school") && result[i+1].matches("[a-zA-Z]+"))
  {
  result[i]="school?state=";
  if(result[i+2].matches("[a-zA-Z]+") && (!result[i+2].equals("member")))
  {
   
  result[i+2]="&city="+result[i+2];
 
  }
 
  }
  else if(i-2 >=0 && result[i].matches("[a-zA-Z]+") && result[i-1].equals("school?state=") )
  {}
  else if(i-1>= 0 && result[i].matches("[a-zA-Z]+") &&result[i-2].equals("school?state=") )
    {}
  else 
  {
  result[i]=result[i]+"/";
  }

            reurl=reurl+result[i];
            i++;
        }
 if(url.charAt(url.length() - 1)!='/' && reurl.charAt(reurl.length()-1)=='/')
{
 reurl = reurl.substring(0,reurl.length() - 1);
}
 
 System.out.println(reurl);
 

}

}
--------------------编程问答-------------------- 你方法都写到main函数里面,当然没有返回值了。。
写到普通方法里面不就有返回值了?
至于url替换,直接用正则定下格式替换特定位置就可以。、
最后,转发url请求也得new 一个URL把。 --------------------编程问答--------------------
引用 1 楼 AA5279AA 的回复:
你方法都写到main函数里面,当然没有返回值了。。
写到普通方法里面不就有返回值了?
至于url替换,直接用正则定下格式替换特定位置就可以。、
最后,转发url请求也得new 一个URL把。


怎么用正则表达式定下格式替换指定位置呀?是用pattern吗?
真对不起,因为我没有java经验,全靠baidu google在自己摸索
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,