国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Java正則表達式詳解(中)

2019-11-18 12:12:23
字體:
供稿:網(wǎng)友

  三、應用實例 
  
  下面我們來看看Jakarta-ORO庫的一些應用實例。 
  
  
  3.1 日志文件處理 
  
  任務:分析一個Web服務器日志文件,確定每一個用戶花在網(wǎng)站上的時間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:  Java正則表達式詳解(中)(圖一)


  分析這個日志記錄,可以發(fā)現(xiàn),要從這個日志文件提取的內(nèi)容有兩項:ip地址和頁面訪問時間。你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標記。 
  
  首先我們來看看IP地址。IP地址有4個字節(jié)構成,每一個字節(jié)的值在0到255之間,各個字節(jié)通過一個句點分隔。因此,IP地址中的每一個字節(jié)有至少一個、最多三個數(shù)字。圖八顯示了為IP地址編寫的正則表達式: 
   Java正則表達式詳解(中)(圖二)
   圖八:匹配IP地址
  
  IP地址中的句點字符必須進行轉(zhuǎn)義處理(前面加上“/”),因為IP地址中的句點具有它本來的含義,而不是采用正則表達式語法中的非凡含義。句點在正則表達式中的非凡含義本文前面已經(jīng)介紹。 
  
  日志記錄的時間部分由一對方括號包圍。你可以按照如下思路提取出方括號里面的所有內(nèi)容:首先搜索起始方括號字符(“[”),提取出所有不超過結束方括號字符(“]”)的內(nèi)容,向前尋找直至找到結束方括號字符。圖九顯示了這部分的正則表達式。 
   Java正則表達式詳解(中)(圖三)
   圖九:匹配至少一個字符,直至找到“]”
  
  現(xiàn)在,把上述兩個正則表達式加上分組符號(圓括號)后合并成單個表達式,這樣就可以從日志記錄提取出IP地址和時間。注重,為了匹配“- -”(但不提取它),正則表達式中間加入了“/s-/s-/s”。完整的正則表達式如圖十所示。 
   Java正則表達式詳解(中)(圖四)
  圖十:匹配IP地址和時間標記
  
  現(xiàn)在正則表達式已經(jīng)編寫完畢,接下來可以編寫使用正則表達式庫的java代碼了。 
  
  為使用Jakarta-ORO庫,首先創(chuàng)建正則表達式字符串和待分析的日志記錄字符串: 
   Java正則表達式詳解(中)(圖五)
  這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(“/”)進行轉(zhuǎn)義處理。圖十不是Java的表示形式,所以我們要在每個“/”前面加上一個“/”以免出現(xiàn)編譯錯誤。遺憾的是,轉(zhuǎn)義處理過程很輕易出現(xiàn)錯誤,所以應該小心謹慎。你可以首先輸入未經(jīng)轉(zhuǎn)義處理的正則表達式,然后從左到右依次把每一個“/”替換成“//”。假如要復檢,你可以試著把它輸出到屏幕上。 
  
  初始化字符串之后,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創(chuàng)建
   Java正則表達式詳解(中)(圖六)
  現(xiàn)在,創(chuàng)建PatternMatcher對象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:
   Java正則表達式詳解(中)(圖七)
  接下來,利用PatternMatcher接口返回的MatchResult對象,輸出匹配的組。由于logEntry字符串包含匹配的內(nèi)容,你可以看到類如下面的輸出:
   Java正則表達式詳解(中)(圖八)
  3.2 Html處理實例一 
  
  下面一個任務是分析HTML頁面內(nèi)FONT標記的所有屬性。HTML頁面內(nèi)典型的FONT標記如下所示
   Java正則表達式詳解(中)(圖九)
  
  程序?qū)凑杖缦滦问剑敵雒恳粋€FONT標記的屬性:
   Java正則表達式詳解(中)(圖十)
  在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從   Java正則表達式詳解(中)(圖十)
  圖十一:匹配FONT標記的所有屬性
  
  第二個正則表達式如圖十二所示,它把各個屬性分割成名字-值對。 
   Java正則表達式詳解(中)(圖十二)
  
   圖十二:匹配單個屬性,并把它分割成名字-值對
  
  分割結果為: 
   Java正則表達式詳解(中)(圖十三)
  現(xiàn)在我們來看看完成這個任務的Java代碼。首先創(chuàng)建兩個正則表達式字符串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區(qū)分大小寫。 
  
  接下來,創(chuàng)建一個執(zhí)行匹配操作的Perl5Matcher對象。 
   Java正則表達式詳解(中)(圖十四)
  假設有一個String類型的變量html,它代表了HTML文件中的一行內(nèi)容。假如html字符串包含F(xiàn)ONT標記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所 Java正則表達式詳解(中)(圖十五)
  接下來創(chuàng)建一個PatternMatcherInput對象。這個對象答應你從最后一次匹配的位置開始繼續(xù)進行匹配操作,因此,它很適合于提取FONT標記內(nèi)屬性的名字-值對。創(chuàng)建PatternMatcherInput對象,以參數(shù)形式傳入待匹配的字符串。然后,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字符串對象)為參數(shù),反復地調(diào)用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內(nèi)部的指針向前移動,下一次檢測將從前一次匹配位置的后面開始。 
  
  本例的輸出結果如下: 
  Java正則表達式詳解(中)(圖十六)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武宁县| 吴旗县| 龙南县| 兴城市| 旺苍县| 阿拉善盟| 灌云县| 宜兰县| 孟州市| 和林格尔县| 浪卡子县| 盱眙县| 育儿| 日照市| 读书| 吉安县| 兴和县| 祁门县| 清远市| 固安县| 黄大仙区| 贵州省| 筠连县| 保定市| 梨树县| 昂仁县| 教育| 琼结县| 吴川市| 桑植县| 泰来县| 宁明县| 庄浪县| 邢台县| 洛川县| 天门市| 富川| 邵武市| 龙陵县| 东光县| 宿迁市|