熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java正則表達式詳解(中)

2013-11-23 19:20:52  來源: Java核心技術 

  
  三應用實例 
  
  下面我們來看看JakartaORO庫的一些應用實例 
  
  
   日志文件處理 
  
  任務分析一個Web服務器日志文件確定每一個用戶花在網站上的時間在典型的BEA WebLogic日志文件中日志記錄的格式如下  
  分析這個日志記錄可以發現要從這個日志文件提取的內容有兩項IP地址和頁面訪問時間你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標記 
  
  首先我們來看看IP地址IP地址有個字節構成每一個字節的值在之間各個字節通過一個句點分隔因此IP地址中的每一個字節有至少一個最多三個數字圖八顯示了為IP地址編寫的正則表達式 
   
   圖八匹配IP地址
  
  IP地址中的句點字符必須進行轉義處理(前面加上\因為IP地址中的句點具有它本來的含義而不是采用正則表達式語法中的特殊含義句點在正則表達式中的特殊含義本文前面已經介紹 
  
  日志記錄的時間部分由一對方括號包圍你可以按照如下思路提取出方括號裡面的所有內容首先搜索起始方括號字符([提取出所有不超過結束方括號字符(])的內容向前尋找直至找到結束方括號字符圖九顯示了這部分的正則表達式 
   
   圖九匹配至少一個字符直至找到]
  
  現在把上述兩個正則表達式加上分組符號(圓括號)後合並成單個表達式這樣就可以從日志記錄提取出IP地址和時間注意為了匹配 (但不提取它)正則表達式中間加入了\s\s\s完整的正則表達式如圖十所示 
   
  圖十匹配IP地址和時間標記
  
  現在正則表達式已經編寫完畢接下來可以編寫使用正則表達式庫的Java代碼了 
  
  為使用JakartaORO庫首先創建正則表達式字符串和待分析的日志記錄字符串 
   
  這裡使用的正則表達式與圖十的正則表達式差不多完全相同但有一點例外在Java中你必須對每一個向前的斜槓(\)進行轉義處理圖十不是Java的表示形式所以我們要在每個\前面加上一個\以免出現編譯錯誤遺憾的是轉義處理過程很容易出現錯誤所以應該小心謹慎你可以首先輸入未經轉義處理的正則表達式然後從左到右依次把每一個\替換成\\如果要復檢你可以試著把它輸出到屏幕上 
  
  初始化字符串之後實例化PatternCompiler對象用PatternCompiler編譯正則表達式創建
   
  現在創建PatternMatcher對象調用PatternMatcher接口的contain()方法檢查匹配情況
   
  接下來利用PatternMatcher接口返回的MatchResult對象輸出匹配的組由於logEntry字符串包含匹配的內容你可以看到類如下面的輸出
   
   HTML處理實例一 
  
  下面一個任務是分析HTML頁面內FONT標記的所有屬性HTML頁面內典型的FONT標記如下所示
   
  
  程序將按照如下形式輸出每一個FONT標記的屬性
   
  在這種情況下我建議你使用兩個正則表達式第一個如圖十一所示它從字體標記提取出face=Arial Serif size=+ color=red
   
  圖十一匹配FONT標記的所有屬性
  
  第二個正則表達式如圖十二所示它把各個屬性分割成名字值對 
   
  
   圖十二匹配單個屬性並把它分割成名字值對
  
  分割結果為 
   
  現在我們來看看完成這個任務的Java代碼首先創建兩個正則表達式字符串用PerlCompiler把它們編譯成Pattern對象編譯正則表達式的時候指定PerlCompilerCASE_INSENSITIVE_MASK選項使得匹配操作不區分大小寫 
  
  接下來創建一個執行匹配操作的PerlMatcher對象 
   
  假設有一個String類型的變量html它代表了HTML文件中的一行內容如果html字符串包含FONT標記匹配器將返回true此時你可以用匹配器對象返回的MatchResult對象獲得第一個組它包含了FONT的所 
  接下來創建一個PatternMatcherInput對象這個對象允許你從最後一次匹配的位置開始繼續進行匹配操作因此它很適合於提取FONT標記內屬性的名字值對創建PatternMatcherInput對象以參數形式傳入待匹配的字符串然後用匹配器實例提取出每一個FONT的屬性這通過指定PatternMatcherInput對象(而不是字符串對象)為參數反復地調用PatternMatcher對象的contains()方法完成PatternMatcherInput對象之中的每一次迭代將把它內部的指針向前移動下一次檢測將從前一次匹配位置的後面開始 
  
  本例的輸出結果如下 
  
  
  
  
  
  
  
  
  
  

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26694.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.