JavaRegex,Regex
一、概述
Regex是一串描述一個字元序列的字元,可以用來尋找其他字元序列中的匹配項。支援Regex處理的是兩個類:Pattern和Matcher,使用Pattern定義Regex,使用Matcher匹配其他序列中的模式。
回到頂部二、建立Regex
建立Regex就是建立一個特殊的字串。
Regex的編譯表達形式:指定為字串的Regex必須首先被編譯為此類的執行個體,然後將得到的模式用於建立Matcher對象。執行匹配所涉及的所有狀態都駐留在匹配器中,多個匹配器可以共用同一模式。
public class Test{ public static void main(String[] args) { Pattern pat=Pattern.compile("a*b"); Matcher mat=pat.matcher("aaaaab"); if(mat.matches()) { System.out.print("匹配"); } }}
上述代碼等同於
if("aaaaab".matches("a*b")) { System.out.print("匹配"); }
Pattern對象可以多次使用,如果某個Regex只需要一次使用,可直接使用Pattern類的靜態matches方法。
Regex的構造摘要:
| 構造 |
匹配 |
| 字元 |
| x |
字元 x |
| \\ |
反斜線字元 |
| \0n |
帶有八進位值 0 的字元 n (0 <= n <= 7) |
| \0nn |
帶有八進位值 0 的字元 nn (0 <= n <= 7) |
| \0mnn |
帶有八進位值 0 的字元 mnn(0 <= m <= 3、0 <= n <= 7) |
| \xhh |
帶有十六進位值 0x 的字元 hh |
| \uhhhh |
帶有十六進位值 0x 的字元 hhhh |
| \t |
定位字元 ('\u0009') |
| \n |
新行(換行)符 ('\u000A') |
| \r |
斷行符號符 ('\u000D') |
| \f |
換頁符 ('\u000C') |
| \a |
警示 (bell) 符 ('\u0007') |
| \e |
轉義符 ('\u001B') |
| \cx |
對應於 x 的控制符 |
| 字元類 |
| [abc] |
a、b 或 c(簡單類) |
| [^abc] |
任何字元,除了 a、b 或 c(否定) |
| [a-zA-Z] |
a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍) |
| [a-d[m-p]] |
a 到 d 或 m 到 p:[a-dm-p](並集) |
| [a-z&&[def]] |
d、e 或 f(交集) |
| [a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](減去) |
| [a-z&&[^m-p]] |
a 到 z,而非 m 到 p:[a-lq-z](減去) |
| 預定義字元類 |
| . |
任何字元(與行結束符可能匹配也可能不匹配) |
| \d |
數字:[0-9] |
| \D |
非數字: [^0-9] |
| \s |
空白字元:[ \t\n\x0B\f\r] |
| \S |
非空白字元:[^\s] |
| \w |
單詞字元:[a-zA-Z_0-9] |
| \W |
非單詞字元:[^\w] |
| 邊界匹配器 |
| ^ |
行的開頭 |
| $ |
行的結尾 |
| \b |
單詞邊界 |
| \B |
非單詞邊界 |
| \A |
輸入的開頭 |
| \G |
上一個匹配的結尾 |
| \Z |
輸入的結尾,僅用於最後的結束符(如果有的話) |
| \z |
輸入的結尾 |
| Greedy 數量詞 |
| X? |
X,一次或一次也沒有 |
| X* |
X,零次或多次 |
| X+ |
X,一次或多次 |
| X{n} |
X,恰好 n 次 |
| X{n,} |
X,至少 n 次 |
| X{n,m} |
X,至少 n 次,但是不超過 m 次 |
| Reluctant 數量詞 |
| X?? |
X,一次或一次也沒有 |
| X*? |
X,零次或多次 |
| X+? |
X,一次或多次 |
| X{n}? |
X,恰好 n 次 |
| X{n,}? |
X,至少 n 次 |
| X{n,m}? |
X,至少 n 次,但是不超過 m 次 |
| Possessive 數量詞 |
| X?+ |
X,一次或一次也沒有 |
| X*+ |
X,零次或多次 |
| X++ |
X,一次或多次 |
| X{n}+ |
X,恰好 n 次 |
| X{n,}+ |
X,至少 n 次 |
| X{n,m}+ |
X,至少 n 次,但是不超過 m 次 |
| Logical 運算子 |
| XY |
X 後跟 Y |
| X|Y |
X 或 Y |
| (X) |
X,作為擷取的群組 |
Regex支援的數量標識符有如下幾種模式:
Greedy(貪婪模式):預設情況下數量表示符採用貪婪模式,該方式會一直匹配下去直到無法匹配為止。
Reluctant(勉強模式):用問號尾碼(?)表示。它只會匹配最少的字元。
Possessive(佔有模式):用加號尾碼(+)表示,一般較少使用。
eg:
public class RegExp{ public static void main(String[] args) { Pattern pat1=Pattern.compile("\\w.*ab"); Pattern pat2=Pattern.compile("\\w.*?ab"); Matcher mat1=pat1.matcher("bbbbab aaab jjjjj is"); Matcher mat2=pat2.matcher("bbbbab aaab jjjjj is"); System.out.println("-----貪婪模式-------"); while(mat1.find()) { System.out.println(mat1.group()); //貪婪模式下會一直匹配,輸出"bbbbab aaab" } System.out.println("-----勉強模式-------"); while(mat2.find()) { System.out.println(mat2.group()); //勉強模式下會最小匹配,輸出"bbbbab '換行' aaab" } }}
輸出結果:
回到頂部三、使用Regex
Pattern類沒有定義建構函式,是在調用compile()方法時建立模式。
Matcher類也沒有建構函式,而是調用Pattern定義的matches方法時建立一個Matcher,只要建立了Mather就可以使用它的方法執行各種模式比對操作。
matches 方法嘗試將整個輸入序列與該模式比對。
lookingAt 嘗試將輸入序列從頭開始與該模式比對。
find 方法掃描輸入序列以尋找與該模式比對的下一個子序列。
每個方法都返回一個表示成功或者失敗的布爾值。通過查詢匹配器的狀態可以擷取