在javascript视频的第七讲的第一个片断,也就是网站上提供的免费片断《正则表达式的应用》中,讲到了将一个保存有ip地址与地区对照关系的文本文件导入到数据库时,应该将其中的某些空格替换成逗号(,),即对于如下格式的文本文件内容: 
起始IP 结束IP 地区 
--------------------------------------------------------------- 
61.54.231.245 61.54.231.245 河南省安阳市 新世纪网吧 
61.54.231.246 61.54.231.246 河南省安阳市 未知地区 
61.54.231.9 61.54.231.247 河南省安阳市 红日网吧 
61.54.231.248 61.54.231.248 河南省安阳市 安阳师范学院 
61.54.231.249 61.54.231.249 河南省安阳市 黑蜘蛛网吧(师范学院附近) 
应转换成下面的这种格式: 
61.54.231.245,61.54.231.245,河南省安阳市 新世纪网吧 
61.54.231.246,61.54.231.246,河南省安阳市 未知地区 
61.54.231.247,61.54.231.247,河南省安阳市 红日网吧 
61.54.231.248,61.54.231.248,河南省安阳市 安阳师范学院 
61.54.231.249,61.54.231.249,河南省安阳市 黑蜘蛛网吧(师范学院附近)     在视频教程中,讲解了使用UltraEdit的正则表达式替换功能来完成上面的转换。从jdk1.4开始,Java语言中提供用于处理正则表达式的相关API类和方法,在jdk帮助文档中,查看String类的replaceAll方法,可以看到该方法就支持类似UltraEdit的正则表达式替换功能。 
    任务:阅读String.replaceAll方法的帮助,以及它提供的相关超链接,了解该方法的用法后,编写一个Java程序来自动实现上面的正则表达式替换,将a.txt(下载)替换后的结果保存到b.txt文件中。另外,我们在实现IT315网站的ip地区查询系统时,使用的是类似如下的sql语法: 
    select 地区 from ip表 where 用户ip>起始IP and 用户ip<结束ip 
    通过这条sql语句就可以查询出用户ip所对应的地区结果。由于用户ip与起始ip和结束ip的比较属于字符串比较,如果用户ip为9.1.1.1,那么它与61.54.231.245比较的结果就是前者大于后者,因为用户ip的第一个字符“9”大于61.54.231.245中的第一个字符“6”。 
    现在请你想出一种解决办法,让上面的sql语句能够返回正确结果。提示:将9.1.1.1变化成009.001.001.001后与061.054.231.245进行比较就可以了。 
    请按这种思路在你的程序中增加进行这种改变的正则表达式替换。注意,起始IP和结束IP的四个字段都有可能是1位、2位或3位数字,例如,61.5.23.1。 
    在源程序中,要对程序代码的功能进行注释说明,提交你编写的程序给我们时,请附带该程序的使用说明。大家继续帮忙解决哈!完即给分,谢谢!

解决方案 »

  1.   

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test20070129 { /**
     * @param args
     */
    public static void main(String[] args) {
    //String yc = "61.54.231.245 61.64.231.245 河南省安阳市 新世纪网吧";
    Test20070129 tt = new Test20070129();
    tt.ReadAndWrite();
    //System.out.println(tt.StringChange(yc));
    } public String StringChange(String s) {
    Pattern p = Pattern.compile("[0-9]{1}.{5,13}[0-9]{1} {1}");
    Matcher m = p.matcher(s);
    StringBuffer b = new StringBuffer(50);
    while (m.find()) {
    String s1 = m.group();
    String[] s2 = s1.split("\\.");
    for (int i = 0; i < s2.length; i++) {
    b.append(this.addZero(s2[i]));
    if (i == s2.length - 1) {
    b.append(",");
    } else {
    b.append(".");
    }
    } }
    b.append(s.replaceAll("[0-9]{1}.{5,13}[0-9]{1} {1}", ""));
    return b.toString();
    } private String addZero(String s) {
    if (s != null) {
    s=s.trim();
    int n = s.length();

    if (n == 1) {
    s = "00" + s;
    } else if (n == 2) {
    s = "0" + s;
    } else if (n > 3) {
    s = s.substring(0, 3);
    } }
    return s;
    } public void ReadAndWrite() {
    FileReader reader;
    String sLine; try {
    reader = new FileReader("c:/a.txt");
    BufferedReader br = new BufferedReader(reader);
    StringBuffer wr= new StringBuffer(100);
     while((sLine = br.readLine()) != null) {
     wr.append(this.StringChange(sLine)).append("\r\n");
     }
     
     FileOutputStream out = new FileOutputStream(new File("c:/b.txt"));
                 out.write(wr.toString().getBytes());
                 out.flush();
                 out.close();  br.close();
                 reader.close();
     
    } catch (FileNotFoundException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } }}
      

  2.   

    aotianji1238(塔罗大道) 
    能解释下:Pattern p = Pattern.compile("[0-9]{1}.{5,13}[0-9]{1} {1}")
             b.append(s.replaceAll("[0-9]{1}.{5,13}[0-9]{1} {1}", ""))
    什么意思吗?特别是里面的匹配模式!
    还有   //String yc = "61.54.231.245 61.64.231.245 河南省安阳市 新世纪网吧";
          Test20070129 tt = new Test20070129();
          tt.ReadAndWrite();
    第一行怎么被注释了?哪来的Test20070129类?谢谢!!
      

  3.   

    各位高手哪去了?怎么没人帮我呢?郁闷ing!
      

  4.   

    谁再帮忙解释下  String.replaceAll方法的具体应用,包括参数含义,越通俗越好!谢谢!
      

  5.   

    楼主,看你楼上的问题,找一个API文档看看吧,有中文的
      

  6.   

    "12.123.111.97".replaceAll("\\b\\d{2}\\b", "0$0").replaceAll("\\b\\d{1}\\b", "00$0");
    试试看,如何?