Posted on 2006-08-09 17:42
HandSoft 閱讀(402)
評論(0) 編輯 收藏
java.util.regex.Matcher;
通過解釋 Pattern
對
字符序列
執(zhí)行匹配操作的引擎。
通過調用模式的 matcher
方法從模式創(chuàng)建匹配器。創(chuàng)建匹配器后,可以使用它執(zhí)行三種不同的匹配操作:
每個方法都返回一個表示成功或失敗的布爾值。通過查詢匹配器的狀態(tài)可以獲取關于成功匹配的更多信息。
匹配器在其輸入的子集(稱為區(qū)域)中查找匹配項。默認情況下,此區(qū)域包含全部的匹配器輸入。可通過 region
方法修改區(qū)域,通過 regionStart
和 regionEnd
方法查詢區(qū)域。區(qū)域邊界與某些模式構造交互的方式是可以更改的。有關此內容更多的信息,請參閱 useAnchoringBounds
和 useTransparentBounds
。
此類還定義使用新字符串替換匹配子序列的方法,需要時,可以從匹配結果計算出新字符串的內容。可以先后使用 appendReplacement
和 appendTail
方法將結果收集到現(xiàn)有的字符串緩沖區(qū),或者使用更加便捷的 replaceAll
方法創(chuàng)建一個可以在其中替換輸入序列中每個匹配子序列的字符串。
匹配器的顯式狀態(tài)包括最近成功匹配的開始和結束索引。它還包括模式中每個捕獲組捕獲的輸入子序列的開始和結束索引以及該子序列的總數(shù)。出于方便的考慮,還提供了以字符串的形式返回這些已捕獲子序列的方法。
匹配器的顯式狀態(tài)最初是未定義的;在成功匹配導致 IllegalStateException
拋出之前嘗試查詢其中的任何部分。每個匹配操作都將重新計算匹配器的顯式狀態(tài)。
匹配器的隱式狀態(tài)包括輸入字符序列和追加位置,追加位置最初是零,然后由 appendReplacement
方法更新。
可以通過調用匹配器的 reset()
方法來顯式重置匹配器,如果需要新輸入序列,則調用其 reset(CharSequence)
方法。重置匹配器將放棄其顯式狀態(tài)信息并將追加位置設置為零。
此類的實例用于多個并發(fā)線程是不安全的。
java.util.regex.Pattern正則表達式的編譯表示形式。
指定為字符串的正則表達式必須首先被編譯為此類的實例。然后,可將得到的模式用于創(chuàng)建 Matcher
對象,依照正則表達式,該對象可以與任意
字符序列
匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個匹配器可以共享同一模式。
因此,典型的調用順序是
Pattern p = Pattern.compile
("a*b");
Matcher m = p.matcher
("aaaaab");
boolean b = m.matches
();
在僅使用一次正則表達式時,可以方便地通過此類定義 matches
方法。此方法編譯表達式并在單個調用中將輸入序列與其匹配。語句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三個語句,盡管對于重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。
此類的實例是不可變的,可供多個并發(fā)線程安全使用。Matcher
類的實例用于此
一個正則表達式,就是用某種模式去匹配一類字符串的一個公式。一旦你弄懂它們,你就能把數(shù)小時辛苦而且易錯的文本處理工作壓縮在幾分鐘(甚至幾秒鐘)內完成。正則表達式被各種文本編輯軟件、類庫(例如Rogue Wave的tools.h++)、腳本工具(像awk/grep/sed)廣泛的支持,而且像Microsoft的Visual C++這種交互式IDE也開始支持它了。
正則表達式基礎
正則表達式由一些普通字符和一些
元字符(metacharacters)組成。普通字符包括大小寫的字母和數(shù)字,而元字符則具有特殊的含義,我們下面會給予解釋。
在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。
要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了所有的元字符和對它們的一個簡短的描述。
. | | 匹配任何單個字符。例如正則表達式r.t匹配這些字符串:rat、rut、r t,但是不匹配root。? |
$ | | 匹配行結束符。例如正則表達式weasel$ 能夠匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。? |
^ | | 匹配一行的開始。例如正則表達式^When in能夠匹配字符串"When in the course of human events"的開始,但是不能匹配"What and When in the"。 |
* | | 匹配0或多個正好在它之前的那個字符。例如正則表達式.*意味著能夠匹配任意數(shù)量的任何字符。 |
\ | | 這是引用府,用來將這里列出的這些元字符當作普通的字符來進行匹配。例如正則表達式\$被用來匹配美元符號,而不是行尾,類似的,正則表達式\.用來匹配點字符,而不是任何字符的通配符。 |
[ ]? [c1-c2] [^c1-c2] | | 匹配括號中的任何一個字符。例如正則表達式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括號中使用連字符-來指定字符的區(qū)間,例如正則表達式[0-9]可以匹配任何數(shù)字字符;還可以制定多個區(qū)間,例如正則表達式[A-Za-z]可以匹配任何大小寫字母。另一個重要的用法是“排除”,要想匹配除了指定區(qū)間之外的字符——也就是所謂的補集——在左邊的括號和第一個字符之間使用^字符,例如正則表達式[^269A-Z] 將匹配除了2、6、9和所有大寫字母之外的任何字符。 |
\< \> | | 匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\<the能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。 |
\( \) | | 將 \( 和 \) 之間的表達式定義為“組”(group),并且將匹配這個表達式的字符保存到一個臨時區(qū)域(一個正則表達式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。 |
| | | 將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。 |
+ | | 匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。 |
? | | 匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。 |
\{i\} \{i,j\} | | 匹配指定數(shù)目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]\{3\} 能夠匹配字符"A"后面跟著正好3個數(shù)字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]\{4,6\} 匹配連續(xù)的任意4個、5個或者6個數(shù)字字符。注意:這個元字符不是所有的軟件都支持的。 |