如果你曾經用過Perl或任何其他內建Regex支援的語言,你一定知道用Regex處理文本和匹配模式是多麼簡單。如果你不熟悉這個術語,那麼“Regex”(Regular Expression)就是一個字元構成的串,它定義了一個用來搜尋匹配字串的模式。
許多語言,包括Perl、PHP、Python、JavaScript和JScript,都支援用Regex處理文本,一些文字編輯器用Regex實現進階“搜尋-替換”功能。那麼Java又怎樣呢?本文寫作時,一個包含了用Regex進行文本處理的Java規範需求(Specification Request)已經得到認可,你可以期待在JDK的下一版本中看到它。
然而,如果現在就需要使用Regex,又該怎麼辦呢?你可以從Apache.org下載原始碼開放的Jakarta-ORO庫。本文接下來的內容先簡要地介紹Regex的入門知識,然後以Jakarta-ORO API為例介紹如何使用Regex。
一、Regex基礎知識
我們先從簡單的開始。假設你要搜尋一個包含字元“cat”的字串,搜尋用的Regex就是“cat”。如果搜尋對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:
1.1 句點符號
假設你在玩英文拼字遊戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用Regex搜尋它的全部內容。要構造出這個Regex,你可以使用一個萬用字元——句點符號“.”。這樣,完整的運算式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字元,包括空格、Tab字元甚至分行符號:
1.2 方括弧符號
為瞭解決句點符號匹配範圍過於廣泛這一問題,你可以在方括弧(“[]”)裡面指定看來有意義的字元。此時,只有方括弧裡面指定的字元才參與匹配。也就是說,Regex“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括弧之內你只能匹配單個字元:
1.3 “或”符號
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那麼,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”Regex。這裡不能使用方擴號,因為方括弧只允許匹配單個字元;這裡必須使用圓括弧“()”。圓括弧還可以用來分組,具體請參見後面介紹。