前言
java.util.regex
是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher
Pattern
一個Pattern是一個正則表達式經編譯后的表現模式。 Matcher
一個Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。
首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。
Pattern介紹
正則表達式的編譯表示。
必須首先將正則表達式(指定為字符串)編譯為此類的實例。 然后將所得的圖案可以被用來創建一個Matcher對象可以匹配任意character sequences針對正則表達式。
執行匹配的所有狀態都駐留在匹配器中,所以許多匹配者可以共享相同的模式。
所有方法:
Predicate<String> asPredicate() 創建可用於匹配字符串的謂詞。
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) 將給定的輸入序列分成這個模式的匹配。
Stream<String> splitAsStream(CharSequence input) 根據給定的輸入序列創建一個流,該流與該模式匹配。
String toString() 返回此模式的字符串表示形式。
Matcher介紹
匹配器
Matcher appendReplacement(StringBuffer sb, String replacement) 實施非終端附加和替換步驟。
StringBuffer appendTail(StringBuffer sb) 實施終端附加和替換步驟。
int end() 返回最后一個字符匹配后的偏移量。
int end(int group) 返回在上次匹配操作期間由給定組捕獲的子序列的最后一個字符之后的偏移量。
int end(String name) 返回給定捕獲子序列的最后一個字符之后的偏移量 named-capturing group以前的匹配操作期間。
boolean find() 嘗試找到匹配模式的輸入序列的下一個子序列。
boolean find(int start) 重新設置該匹配器,然后嘗試從指定的索引開始找到匹配模式的輸入序列的下一個子序列。
String group() 返回與上一個匹配匹配的輸入子序列。
String group(int group) 返回在上一次匹配操作期間由給定組捕獲的輸入子序列。
String group(String name) 返回給定捕獲的輸入子序列 named-capturing 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) 返回給定組在上一個匹配操作期間捕獲的子序列的開始索引。
int start(String name) 返回給定捕獲的子序列的初始索引 named-capturing group以前的匹配操作期間。
MatchResult toMatchResult() 返回此匹配器的匹配狀態為MatchResult 。
String toString() 返回此匹配器的字符串表示形式。
Matcher useAnchoringBounds(boolean b) 設置該匹配器的區域邊界的錨定。
Matcher usePattern(Pattern newPattern) 更改,這 Matcher用於查找與匹配的 Pattern。
Matcher useTransparentBounds(boolean b) 設置此匹配器的區域邊界的透明度。
測試數據
//測試1
String s="11.1斤巫妖王,12.2斤大螺絲,33斤死亡之翼,44.4斤狼人";
String regex="[0123456789.]+";//匹配數字與小數點的正則表達式的字符串
String regex2="\\d.+";
int number=0;
double sum=0.0;
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
number=number+1;
try{
sum=sum+Double.parseDouble(m.group());
}
catch(NumberFormatException e){
System.out.println(e.getMessage());
}
}
System.out.println("循環次數"+number);
System.out.println("總數:"+sum); //哈哈 出現了浮點型精確度問題
//返回結果:
//11.1
//12.2
//33
//44.4
//循環次數4
//總數:100.69999999999999
//測試2
Pattern p2=Pattern.compile("([a-z]+)(\\d+)");
Matcher m2=p2.matcher("aaa2223bb");
System.out.println(m2.find());
System.out.println(m2.start(1)); //0 返回第一組匹配到的子字符串在字符串中的索引號
System.out.println(m2.start(2)); //3
System.out.println(m2.end(1)); //3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置
System.out.println(m2.end(2)); //7
System.out.println(m2.group()); //aaa2223
System.out.println(m2.group(1)); //aaa 匹配結果的第一個子字符串
System.out.println(m2.group(2)); //2223 匹配結果的第二個子字符串
System.out.println(m2.groupCount() ); //2 因為有2個子字符串