讀古今文學網 > 精通正則表達式(第3版) > The Pattern.compile() Factory >

The Pattern.compile() Factory

ThePattern.compile Factory

正則表達式的Pattern對象是通過Pattern.compile生成的。第一個參數是代表正則表達式的字符串(☞101)。368頁表格8-3中的選項可以作為第二個參數。下面的代碼從字符串myRegex生成一個pattern,進行不區分大小寫的匹配:

預定義的 pattern 常量用來指定編譯選項(例如 Pattern.CASE_INSENSITIVE),這可能有點笨拙(注2),所以我會使用正則表達式內部的模式修飾符(☞110)。包括378頁的「(?x)」,399頁的「(?s)」和多個「(?i)」。

不過,預定義常量固然複雜,但這種「笨辦法(unwieldy)」能夠降低新手閱讀代碼的難度。如果沒有頁面寬度限制,我們可以這樣寫第384頁的Pattern.compile的第二個參數:

Pattern.UNIX_LINES|Pattern.CASE_INSENSITIVE

而不是在正則表達式開頭使用不那麼清楚的「(?id)」。

從名字可以看出,這一步把正則表達式解析並編譯為內部形式。第 6 章對此有詳細講解(☞241),簡單地說,在字符串內應用表達式的整個過程中,編譯pattern 通常是最耗時間的。所以要把編譯獨立出來,作為第一步——這樣就可以先期將正則表達式編譯好,重複使用。

當然,如果正則表達式編譯之後只需要使用一次,編譯時機就不是個問題,但如果需要多次應用(例如應用到讀入文件的每一行),預編譯Pattern對象就很有價值。

調用Patern.compile可能拋出兩種類型的異常:如果正則表達式不合規則,拋出Pattern-SyntaxException,選項不合規則,拋出IllegalArgumentException。

Pattern的matcher方法

Pattern's matchermethod

下一節(☞394)我們會看到,Pattern提供了某些簡便的方法,但是大多數情況下,我們只需要一個方法完成所有工作:matcher。它接受一個參數:需要檢索的字符串(注 3)。此時並沒有確切應用這個正則表達式,而只是為將 pattern應用到特定的字符串做準備。matcher方法返回一個Matcher對象。