/**
           * @author Solo
           *
           * 很久以前寫的一道題目,昨天翻出來看了看,都有些忘記了,花了1個(gè)小時(shí)補(bǔ)上了注釋
           * 對(duì)于學(xué)習(xí)在Java中使用正則表達(dá)式有點(diǎn)幫助
           * 將一個(gè)保存有ip地址與地區(qū)對(duì)照關(guān)系的文本文件導(dǎo)入到數(shù)據(jù)庫時(shí),
           * 應(yīng)該將其中的某些空格替換成逗號(hào)(,),即對(duì)于如下格式的文本文件內(nèi)容:
           * 起始IP 結(jié)束IP 地區(qū)
           * ---------------------------------------------------------------
           * 61.54.231.245 61.54.231.245 河南省安陽市 新世紀(jì)網(wǎng)吧
           * 61.54.231.246 61.54.231.246 河南省安陽市 未知地區(qū)
           * 61.54.231.9 61.54.231.247 河南省安陽市 紅日網(wǎng)吧
           * 61.54.231.248 61.54.231.248 河南省安陽市 安陽師范學(xué)院
           * 61.54.231.249 61.54.231.249 河南省安陽市 黑蜘蛛網(wǎng)吧(師范學(xué)院附近)
           * 應(yīng)轉(zhuǎn)換成下面的這種格式:
           * 61.54.231.245,61.54.231.245,河南省安陽市 新世紀(jì)網(wǎng)吧
           * 61.54.231.246,61.54.231.246,河南省安陽市 未知地區(qū)
           * 61.54.231.247,61.54.231.247,河南省安陽市 紅日網(wǎng)吧
           * 61.54.231.248,61.54.231.248,河南省安陽市 安陽師范學(xué)院
           * 61.54.231.249,61.54.231.249,河南省安陽市 黑蜘蛛網(wǎng)吧(師范學(xué)院附近)
           * 任務(wù):
           * 閱讀String.replaceAll方法的幫助,以及它提供的相關(guān)超鏈接,
           * 了解該方法的用法后,編寫一個(gè)java程序來自動(dòng)實(shí)現(xiàn)上面的正則表達(dá)式替換,
           * 將a.txt替換后的結(jié)果保存到b.txt文件中。
           * 另外,我們?cè)趯?shí)現(xiàn)ip地區(qū)查詢系統(tǒng)時(shí),使用的是類似如下的sql語法:
           * select 地區(qū) from ip表 where 用戶ip>起始IP and 用戶ip<結(jié)束ip
           * 通過這條sql語句就可以查詢出用戶ip所對(duì)應(yīng)的地區(qū)結(jié)果。由于用戶ip與起始
           * ip和結(jié)束ip的比較屬于字符串比較,如果用戶ip為9.1.1.1,那么它與
           * 61.54.231.245比較的結(jié)果就是前者大于后者,因?yàn)橛脩鬷p的第一個(gè)字符“9”
           * 大于61.54.231.245中的第一個(gè)字符“6”。
           * 現(xiàn)在請(qǐng)你想出一種解決辦法,讓上面的sql語句能夠返回正確結(jié)果。
           * 請(qǐng)按這種思路在你的程序中增加進(jìn)行這種改變的正則表達(dá)式替換。
           */

          import java.io.*;
          import java.util.regex.*;

          public class Ip
          {
              private static void fileIO(File f)
              {
                  String strLine;
                 
                  // 調(diào)用執(zhí)行本程序的操作系統(tǒng)的標(biāo)準(zhǔn)換行符,意味著跨平臺(tái)
                  String line = System.getProperty("line.separator");
                  try
                  {
                      // 輸入流
                      FileInputStream fis = new FileInputStream(f);
                      InputStreamReader isr = new InputStreamReader(fis);
                      BufferedReader br = new BufferedReader(isr);
                     
                      // 輸出流
                      FileOutputStream fos = new FileOutputStream("c://b.txt");
                      OutputStreamWriter osw = new OutputStreamWriter(fos);
                      BufferedWriter bw = new BufferedWriter(osw);
                     
                      /*
                       * 創(chuàng)建一個(gè)模式對(duì)象, 模式中編輯的正則表達(dá)式匹配分別是(200-249|250-255|001-199) 以匹配一個(gè)IP地址
                       */
                      Pattern pattern = Pattern
                              .compile("((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)");
                     
                      // 聲明模式適配器
                      Matcher matcher;
                     
                      // 循環(huán)讀取文件中的每一行
                      while ((strLine = br.readLine()) != null)
                      {
                          /*
                           * String調(diào)用replaceAll方法匹配一個(gè)正則表達(dá)式找到一個(gè)位置,然后替換成逗號(hào)
                           */
                          strLine = strLine.replaceAll("(?<=d)s+", ",");
                          
                          // 用適配器加載一行字符串,并匹配模式
                          matcher = pattern.matcher(strLine);
                         
                          // 如果在一行中能找到匹配的字符串則循環(huán)
                          while (matcher.find())
                          {
                              // 取一行中第一個(gè)能匹配的子字符串
                              String buf = matcher.group();
                             
                              // 以"."分割成數(shù)字,然后分別補(bǔ)零,再合并
                              strLine = matcher.replaceAll(change(buf));
                            
                              // 輸入一行到文件,但不包括換行符
                              bw.write(strLine);
                             
                              // 輸入行分割符,即換行符
                              bw.write(line);
                          }
                      }
                     
                      // 關(guān)閉輸入流
                      br.close();
                     
                      // 關(guān)閉輸出流
                      bw.close();
                  }
                  // 捕獲原始文件未找到異常
                  catch (FileNotFoundException e)
                  {
                      System.out.println("原始文件未找到");
                  }
                  // 捕獲IO異常
                  catch (IOException e)
                  {
                      e.printStackTrace();
                  }

              }
             
              // 此方法用來接收一個(gè)分割出來的一個(gè)數(shù)字,將不足3位的補(bǔ)零后返回
              private static String fill(String str)
              {
                  // 不足3位的補(bǔ)零
                  while (str.length() < 3)
                  {
                      str = '0' + str;
                  }
                 
                  // 返回補(bǔ)零后的字符串
                  return str;
              }
             
              private static String change(String buf)
              {
                  // 緩沖字符串
                  String temp;
                 
                  // 結(jié)果返回字符串
                  String ret;
                 
                  // 以"."分割,存入字符串?dāng)?shù)組
                  String[] str = buf.split(".");
                 
                  // 第一個(gè)數(shù)字不需要在前面加"."
                  ret = fill(str[0]);
                 
                  // 從第2個(gè)數(shù)字開始,給每個(gè)數(shù)字前面分別再加上".",并且不足的補(bǔ)零
                  for (int i = 1; i < str.length; i++)
                  {
                      // 調(diào)用fill方法給不足3位的數(shù)字補(bǔ)零
                      temp = fill(str[i]);
                     
                      // 每個(gè)數(shù)字加點(diǎn)后從新組裝成一個(gè)
                      ret = ret + "." + temp;
                  }
                  // 返回結(jié)果字符串
                  return ret;
              }
             
              // 程序入口
              public static void main(String[] args)
              {
                  // 讀原始文件
                  File f = new File("c://a.txt");
                 
                  // 將原始文件傳入fileIO方法,按要求加工
                  fileIO(f);
              }
          }


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          posts - 3, comments - 32, trackbacks - 0, articles - 3

          Copyright © Exiler

          主站蜘蛛池模板: 奉化市| 武功县| 腾冲县| 汤原县| 邵武市| 肃北| 武安市| 宁津县| 平阴县| 西充县| 八宿县| 攀枝花市| 大同市| 镇沅| 化隆| 金川县| 南澳县| 林西县| 天津市| 富顺县| 清丰县| 饶阳县| 万山特区| 德江县| 阿荣旗| 晋州市| 潢川县| 德钦县| 河曲县| 兴山县| 元氏县| 瓦房店市| 江永县| 毕节市| 镇巴县| 黔南| 法库县| 黄骅市| 农安县| 滦平县| 迁西县|