日期:2014-05-20  浏览次数:20680 次

高份求解一题!正则表达式方面的!
在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。  
        在源程序中,要对程序代码的功能进行注释说明,提交你编写的程序给我们时,请附带该程序的使用说明。


大家继续帮忙解决哈!完即给分,谢谢!

------解决方案--------------------
"9.1.1.1 "有一个方法以 ". "为标志,拆分成 "9 " "1 " "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;