什麼是正則表達式? java
正則表達式就是人爲的定義一些規則,但願計算機按照咱們制定的規則執行。正則表達式主要用於操做字符串 正則表達式
java.util.regex包主要包括如下三個類: app
Pattern類:
Pattern對象是一個正則表達式的編譯表示。Pattern類沒有公共構造方法。要建立一個Pattern對象,你必須首先調用其公共靜態編譯方法(Pattern p = Pattern.compile("a*b")),它返回一個Pattern對象。該方法接受一個正則表達式做爲它的第一個參數。
Matcher類:
Matcher對象是對輸入字符串進行解釋和匹配操做的引擎。與Pattern類同樣,Matcher也沒有公共構造方法。你須要調用Pattern對象的matcher方法來得到一個Matcher對象(Matcher m = p.matcher("aaaaab"))。
PatternSyntaxException:
PatternSyntaxException是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。 函數
正則表達式的語法 ui
字符類 | |
---|---|
[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 次 |
注意:這裏只列出了經常使用的一些語法,具體信息查看文檔 搜索引擎
補充: spa
一、Pattern類的方法摘要 code
方法摘要 | |
---|---|
static Pattern | compile(String regex) 將給定的正則表達式編譯到模式中。 |
static Pattern | compile(String regex, int flags) 將給定的正則表達式編譯到具備給定標誌的模式中。 |
int | flags() 返回此模式的匹配標誌。 |
Matcher | matcher(CharSequence input) 建立匹配給定輸入與此模式的匹配器。 |
static boolean | matches(String regex, CharSequence input) 編譯給定正則表達式並嘗試將給定輸入與其匹配。 |
String | pattern() 返回在其中編譯過此模式的正則表達式。 |
static String | quote(String s) 返回指定String的字面值模式String。 |
String[] | split(CharSequence input) 圍繞此模式的匹配拆分給定輸入序列。 |
String[] | split(CharSequence input, int limit) 圍繞此模式的匹配拆分給定輸入序列。 |
String | toString() 返回此模式的字符串表示形式。 |
二、Matcher類的方法摘要 對象
方法摘要 | |
---|---|
Matcher | appendReplacement(StringBuffer sb, String replacement) 實現非終端添加和替換步驟。 |
StringBuffer | appendTail(StringBuffer sb) 實現終端添加和替換步驟。 |
int | end() 返回最後匹配字符以後的偏移量。 |
int | end(int group) 返回在之前的匹配操做期間,由給定組所捕獲子序列的最後字符以後的偏移量。 |
boolean | find() 嘗試查找與該模式匹配的輸入序列的下一個子序列。 |
boolean | find(int start) 重置此匹配器,而後嘗試查找匹配該模式、從指定索引開始的輸入序列的下一個子序列。 |
String | group() 返回由之前匹配操做所匹配的輸入子序列。 |
String | group(int group) 返回在之前匹配操做期間由給定組捕獲的輸入子序列。 |
int | groupCount() 返回此匹配器模式中的捕獲組數。 |
boolean | hasAnchoringBounds() 查詢此匹配器區域界限的定位。 |
boolean | hasTransparentBounds() 查詢此匹配器區域邊界的透明度。 |
boolean | hitEnd() 若是匹配器執行的最後匹配操做中搜索引擎遇到輸入結尾,則返回 true。 |
boolean | lookingAt() 嘗試將從區域開頭開始的輸入序列與該模式匹配。 |
boolean | matches() 嘗試將整個區域與模式匹配。 |
Pattern | pattern() 返回由此匹配器解釋的模式。 |
static String | quoteReplacement(String s) 返回指定String的字面值替換String。 |
Matcher | region(int start, int end) 設置此匹配器的區域限制。 |
int | regionEnd() 報告此匹配器區域的結束索引(不包括)。 |
int | regionStart() 報告此匹配器區域的開始索引。 |
String | replaceAll(String replacement) 替換模式與給定替換字符串相匹配的輸入序列的每一個子序列。 |
String | replaceFirst(String replacement) 替換模式與給定替換字符串匹配的輸入序列的第一個子序列。 |
boolean | requireEnd() 若是不少輸入均可以將正匹配更改成負匹配,則返回 true。 |
Matcher | reset() 重置匹配器。 |
Matcher | reset(CharSequence input) 重置此具備新輸入序列的匹配器。 |
int | start() 返回之前匹配的初始索引。 |
int | start(int group) 返回在之前的匹配操做期間,由給定組所捕獲的子序列的初始索引。 |
MatchResult | toMatchResult() 做爲 MatchResult 返回此匹配器的匹配狀態。 |
String | toString() 返回匹配器的字符串表示形式。 |
Matcher | useAnchoringBounds(boolean b) 設置匹配器區域界限的定位。 |
Matcher | usePattern(Pattern newPattern) 更改此Matcher用於查找匹配項的Pattern。 |
Matcher | useTransparentBounds(boolean b) 設置此匹配器區域邊界的透明度。 |
案例: 索引
package cc.enfp.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternTest { /* 正則獲取 Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); 一、首先按面向對象的思惟,把正則表達式封裝成類Pattern,可是該類沒有構造函數,只能經過他的靜態方法獲取該類的實例 二、經過正則兌現獲取匹配器,由於匹配器須要依靠正則表達式和字符串,因此說須要把字符串做爲參數傳遞給匹配器對策方法 三、經過匹配器的相應方法完成想要的操做 */ public static void main(String[] args) { String str = "huan ying lai guang lin"; /** * 查找出三個字母組成的單詞 * 注意這裏使用了轉義字符'\\'表示'\' */ Pattern p = Pattern.compile("\\b[a-z]{3}\\b"); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group()); } } }
輸出結果:
lai lin