Java正則表示式學習與記錄
轉載自:http://www.runoob.com/java/java-regular-expressions.html
正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。
1、正則表示式中字元意義:
\ 將下一字元標記為特殊字元。
^ 匹配輸入字串開始的位置。
$ 匹配輸入字串結束的位置。
* 零次或多次匹配前面的字元或子表示式。
+ 一次或多次匹配前面的字元或子表示式。
? 零次或一次匹配前面的字元或子表示式。當此字元緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式是"非貪心的"。
"非貪心的"模式匹配搜尋到的、儘可能短的字串,而預設的"貪心的"模式匹配搜尋到的、儘可能長的字串。例如,
在字串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配所有"o"。
{n} 正好匹配 n 次。
{n,} 至少匹配 n 次。
{n,m} 匹配至少 n 次,至多 m 次。
x|y 匹配 x 或 y。
[xyz] 匹配包含的任一字元。
[^xyz] 匹配未包含的任何字元。
[a-z] 匹配指定範圍內的任何字元。
[^a-z] 匹配不在指定的範圍內的任何字元。
\b 匹配一個字邊界,即字與空格間的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。
\B 非字邊界匹配,"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。
\d 數字字元匹配,等效於 [0-9]。
\D 非數字字元匹配,等效於 [^0-9]。
\f 換頁符匹配,等效於 \x0c 和 \cL。
\n 換行符匹配,等效於 \x0a 和 \cJ。
\r 匹配一個回車符,等效於 \x0d 和 \cM。
\s 匹配任何空白字元,包括空格、製表符、換頁符等,與 [ \f\n\r\t\v] 等效。
\t 製表符匹配,與 \x09 和 \cI 等效。
\v 垂直製表符匹配,與 \x0b 和 \cK 等效。
\w 匹配任何字類字元,包括下劃線,與"[A-Za-z0-9_]"等效。
\W 與任何非單詞字元匹配,與"[^A-Za-z0-9_]"等效。
2、Java中正則表示式主要使用的類為:
- Pattern 類:
pattern 物件是一個正則表示式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 物件,你必須首先呼叫其公共靜態編譯方法,它返回一個 Pattern 物件。該方法接受一個正則表示式作為它的第一個引數。
- Matcher 類:
Matcher 物件是對輸入字串進行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要呼叫 Pattern 物件的 matcher 方法來獲得一個 Matcher 物件。
用法為:
public boolean matches() 嘗試將輸入字串與模式整體匹配,成功返回true,失敗返回false。如果部分匹配成功,將移動到下次匹配的位置
public boolean lookingAt() 嘗試將輸入字串開頭開始的輸入序列與該模式匹配,如果成功,則返回true,並且移動到下次匹配的位置,相當於第一次執行find()方法,start()方法和end()方法也被賦值了。
public boolean find() 嘗試查詢與該模式匹配的輸入序列的下一個子序列,如果成功,則返回true,並且移動到下次匹配的位置。
注意事項: matches()方法和lookingAt()方法相互影響匹配結果,並且都會影響find()的匹配結果,而find()方法不會影響matches()和lookingAt()結果。
例項:
String str = "acbcacdbc"; String regex = "a.{1,2}b"; Pattern pattern = Pattern.compile(regex); Matcher m = pattern.matcher(str); System.out.println("先執行matches()方法,再執行find()方法"); System.out.println(m.matches()); while (m.find()) { System.out.println(str.substring(m.start(), m.end())); } m.reset(); System.out.println("先執行find()方法,再執行matches()方法"); while (m.find()) { System.out.println(str.substring(m.start(), m.end())); } System.out.println(m.matches()); m.reset(); System.out.println("先執行lookingAt()方法,再執行find()方法"); System.out.println(m.lookingAt()); while (m.find()) { System.out.println(str.substring(m.start(), m.end())); } m.reset(); System.out.println("先執行find()方法,再執行lookingAt()方法"); while (m.find()) { System.out.println(str.substring(m.start(), m.end())); } System.out.println(m.lookingAt());
輸出結果:
先執行matches()方法,再執行find()方法 false acdb 先執行find()方法,再執行matches()方法 acb acdb false 先執行lookingAt()方法,再執行find()方法 true acdb 先執行find()方法,再執行lookingAt()方法 acb acdb true