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

Java正則表達式詳解(上)

2013-11-23 18:39:48  來源: Java核心技術 

  如果你曾經用過Perl或任何其他內建正則表達式支持的語言你一定知道用正則表達式處理文本和匹配模式是多麼簡單如果你不熟悉這個術語那麼正則表達式(Regular Expression)就是一個字符構成的串它定義了一個用來搜索匹配字符串的模式 
  
  許多語言包括PerlPHPPythonjavascript和JScript都支持用正則表達式處理文本一些文本編輯器用正則表達式實現高級搜索替換功能那麼Java又怎樣呢?本文寫作時一個包含了用正則表達式進行文本處理的Java規范需求(Specification Request)已經得到認可你可以期待在JDK的下一版本中看到它 
  
  然而如果現在就需要使用正則表達式又該怎麼辦呢?你可以從下載源代碼開放的JakartaORO庫本文接下來的內容先簡要地介紹正則表達式的入門知識然後以JakartaORO API為例介紹如何使用正則表達式 
  
  
  一正則表達式基礎知識 
  
  我們先從簡單的開始假設你要搜索一個包含字符cat的字符串搜索用的正則表達式就是cat如果搜索對大小寫不敏感單詞catalogCatherinesophisticated都可以匹配也就是
   
   句點符號 
  
  假設你在玩英文拼字游戲想要找出三個字母的單詞而且這些單詞必須以t字母開頭n字母結束另外假設有一本英文字典你可以用正則表達式搜索它的全部內容要構造出這個正則表達式你可以使用一個通配符——句點符號這樣完整的表達式就是tn它匹配tantentinton還匹配t#ntpn甚至t n還有其他許多無意義的組合這是因為句點符號匹配所有字符包括空格Tab字符甚至換行符 
   
   方括號符號 
  
  為了解決句點符號匹配范圍過於廣泛這一問題你可以在方括號([])裡面指定看來有意義的字符此時只有方括號裡面指定的字符才參與匹配也就是說正則表達式t[aeio]n只匹配tanTentintonToon不匹配因為在方括號之內你只能匹配單個字符 
   
   符號 
  
  如果除了上面匹配的所有單詞之外你還想要匹配toon那麼你可以使用|操作符|操作符的基本意義就是運算要匹配toon使用t(a|e|i|o|oo)n正則表達式這裡不能使用方擴號因為方括號只允許匹配單個字符這裡必須使用圓括號()圓括號還可以用來分組具體請參見後面介紹 
   
   表示匹配次數的符號 
  
  表一顯示了表示匹配次數的符號這些符號用來確定緊靠該符號左邊的符號出現的次數
  
  假設我們要在文本文件中搜索美國的社會安全號碼這個號碼的格式是用來匹配它的正則表達式如圖一所示在正則表達式中連字符()有著特殊的意義它表示一個范圍比如從因此匹配社會安全號碼中的連字符號時它的前面要加上一個轉義字符\
   
  圖一匹配所有形式的社會安全號碼
  
  假設進行搜索的時候你希望連字符號可以出現也可以不出現——即都屬於正確的格式這時你可以在連字符號後面加上數量限定符號如圖二所示
  
  圖二匹配所有形式的社會安全號碼
  
  下面我們再來看另外一個例子美國汽車牌照的一種格式是四個數字加上二個字母它的正則表達式前面是數字部分[]{}再加上字母部分[AZ]{}圖三顯示了完整的正則表達式 
   
  
  圖三匹配典型的美國汽車牌照號碼KV
  
   符號 
  
  ^符號稱為符號如果用在方括號內^表示不想要匹配的字符例如圖四的正則表達式匹配所有單詞但以X字母開頭的單詞除外 
   
  
  圖四匹配所有單詞X開頭的除外
  
   圓括號和空白符號 
  
  假設要從格式為June 的生日日期中提取出月份部分用來匹配該日期的正則表達
  
  
  圖五匹配所有Moth DDYYYY格式的日期
  
  新出現的\s符號是空白符號匹配所有的空白字符包括Tab字符如果字符串正確匹配接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創建一個組然後用ORO API(本文後面詳細討論)提取出它的值修改後的正則表達式如圖六所示 
   
  
  圖六匹配所有Month DDYYYY格式的日期定義月份值為第一個組
  
   其它符號 
  
  為簡便起見你可以使用一些為常見正則表達式創建的快捷符號如表二所示 
  
  表二常用符號 
   
  例如在前面社會安全號碼的例子中所有出現[]的地方我們都可以使用\d修改後的正則表達式如圖七所示
   
  圖七匹配所有格式的社會安全號碼
  
  
  
  
  二JakartaORO庫 
  
  有許多源代碼開放的正則表達式庫可供Java程序員使用而且它們中的許多支持Perl 兼容的正則表達式語法我在這裡選用的是JakartaORO正則表達式庫它是最全面的正則表達式API之一而且它與Perl 正則表達式完全兼容另外它也是優化得最好的API之一 
  
  JakartaORO庫以前叫做OROMatcherDaniel Savarese大方地把它贈送給了Jakarta Project你可以按照本文最後參考資源的說明下載它 
  
  我首先將簡要介紹使用JakartaORO庫時你必須創建和訪問的對象然後介紹如何使用JakartaORO API 
  
  
  ▲ PatternCompiler對象 
  
  首先創建一個PerlCompiler類的實例並把它賦值給PatternCompiler接口對象PerlCompiler是PatternCompiler接口的一個實現允許你把正則表達式編譯成用來匹配的Pattern對象 
   
  ▲ Pattern對象 
  
  要把正則表達式編譯成Pattern對象調用compiler對象的compile()方法並在調用參數中指定正則表達式例如你可以按照下面這種方式編譯正則表達式t[aeio]n 
   
  默認情況下編譯器創建一個大小寫敏感的模式(pattern)因此上面代碼編譯得到的模式只匹配tintan tenton但不匹配TintaN要創建一個大小寫不敏感的模式你應該在調用編譯器的時候指定一個額外的參數
   
  創建好Pattern對象之後你就可以通過PatternMatcher類用該Pattern對象進行模式匹配 
  
  
  ▲ PatternMatcher對象 
  
  PatternMatcher對象根據Pattern對象和字符串進行匹配檢查你要實例化一個PerlMatcher類並把結果賦值給PatternMatcher接口PerlMatcher類是PatternMatcher接口的一個實現它根據Perl 正則表達式語法進行模式匹配 
  
  使用PatternMatcher對象你可以用多個方法進行匹配操作這些方法的第一個參數都是需要根據正則表達式進行匹配的字符串 
  
  ·boolean matches(String input Pattern pattern)當輸入字符串和正則表達式要精確匹配時使用換句話說正則表達式必須完整地描述輸入字符串 
  
  ·boolean matchesPrefix(String input Pattern pattern)當正則表達式匹配輸入字符串起始部分時使用 
  
  ·boolean contains(String input Pattern pattern)當正則表達式要匹配輸入字符串的一部分時使用(即它必須是一個子串) 
  
  另外在上面三個方法調用中你還可以用PatternMatcherInput對象作為參數替代String對象這時你可以從字符串中最後一次匹配的位置開始繼續進行匹配當字符串可能有多個子串匹配給定的正則表達式時用PatternMatcherInput對象作為參數就很有用了用PatternMatcherInput對象作為參數替代String時上述三個方法的語法如下 
  
  ·boolean matches(PatternMatcherInput input Pattern pattern) 
  
  ·boolean matchesPrefix(PatternMatcherInput input Pattern pattern) 
  
  ·boolean contains(PatternMatcherInput input Pattern pattern) 
  
  
  
  
  
  
  
  

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

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