記一些知識。。。
Java Matcher類
Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查,此類的實例用於多個並發線程是不安全的。
public final class Matcher extends Object implements MatchResult
實例獲取
其構造器也是私有的,可通過靜態方法Pattern.matcher(CharSequence input)得到該類的實例.
方法
Pattern pattern()
pattern()返回parentPattern,返回由此匹配器解釋的模式,即構造器傳入的Pattern對象。
int groupCount()
返回此匹配器模式中的捕獲組數。根據慣例,零組表示整個模式。
Pattern p = Pattern.compile("(\\w+)%(\\d+)"); Matcher m = p.matcher("ab%12-cd%34"); System.out.println(m.groupCount());// 2
String group()
返回當前查找而獲得的與組匹配的所有子串內容。group()實際調用了group(int group)方法,參數group為0。組零表示整個模式。
String group(int group)
返回當前查找而獲得的與組匹配的所有子串內容。
int start()
返回當前匹配的子串的第一個字符在目標字符串中的索引位置 。start()方法返回的是匹配器的狀態first。
int start(int group)
返回當前匹配的指定組中的子串的第一個字符在目標字符串中的索引位置 。
int end()
返回當前匹配的子串的最后一個字符的下一個位置在目標字符串中的索引位置 。end()方法返回的是匹配器的狀態last。
int end(int group)
返回當前匹配的的指定組中的子串的最后一個字符的下一個位置在目標字符串中的索引位置 。
boolean find()
在目標字符串里查找下一個匹配子串。如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。
boolean find(int start)
重置此匹配器,然后嘗試查找匹配該模式,從指定的位置開始查找下一個匹配的子串。如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。
int regionStart()
報告此匹配器區域的開始索引。end()方法返回的是匹配器的狀態from。
int regionEnd()
報告此匹配器區域的結束索引(不包括)。end()方法返回的是匹配器的狀態to。
Matcher region(int start,int end)
設置此匹配器的區域限制。重置匹配器,然后設置區域,使其從 start 參數指定的索引開始,到 end 參數指定的索引結束(不包括end索引處的字符)。
boolean lookingAt()
從目標字符串開始位置進行匹配。只有在有匹配且匹配的某一子串中包含目標字符串第一個字符的情況下才會返回true。
boolean matches()
只有完全匹配時才會返回true。 matches是整個匹配,只有整個字符序列完全匹配成功,才返回True,否則返回False。但如果前部分匹配成功,將移動下次匹配的位置。
Matcher appendReplacement(StringBuffer sb, String replacement)
將當前匹配子串替換為指定字符串,並將從上次匹配結束后到本次匹配結束后之間的字符串添加到一個StringBuffer對象中,最后返回其字符串表示形式。
StringBuffer appendTail(StringBuffer sb)
將最后一次匹配工作后剩余的字符串添加到一個StringBuffer對象里。
String replaceAll(String replacement)
將匹配的子串用指定的字符串替換。
String replaceFirst(String replacement)
將匹配的第一個子串用指定的字符串替換。
Matcher usePattern(Pattern newPattern)
更改匹配器的匹配模式。
public static void main(String[] args) { Pattern p = Pattern.compile("[a-z]+"); Matcher m = p.matcher("111aaa222"); System.out.println(piPei(m)); // (模式[a-z]+):匹配子串:aaa;開始位置:3;結束位置:6; m.usePattern(Pattern.compile("\\d+")); //更改匹配模式 System.out.println(piPei(m)); // (模式\d+):匹配子串:222;開始位置:6;結束位置:9; } public static String piPei(Matcher m) { StringBuffer s = new StringBuffer(); while (m.find()) { s.append("匹配子串:" + m.group() + ";"); s.append("開始位置:" + m.start() + ";"); s.append("結束位置:" + m.end() + ";"); } if (s.length() == 0) { s.append("沒有匹配到!"); } s.insert(0, "(模式" + m.pattern().pattern() + "):"); return s.toString(); }
總結
1. Matcher類的構造方法也是私有的,不能隨意創建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例.
2. 一個Matcher實例是被用來對目標字符串進行基於既有模式(也就是一個給定的Pattern所編譯的正則表達式)進行匹配查找的,所有往Matcher的輸入都是通過CharSequence接口提供的,這樣做的目的在於可以支持對從多元化的數據源所提供的數據進行匹配工作
1. matches是整個匹配,只有整個字符序列完全匹配成功,才返回True,否則返回False。但如果前部分匹配成功,將移動下次匹配的位置。lookingAt是部分匹配,總是從第一個字符進行匹配,匹配成功了不再繼續匹配,匹配失敗了,也不繼續匹配。find是部分匹配,從當前位置開始匹配,找到一個匹配的子串,將移動下次匹配的位置。
2. Mathcher的find和lookingAt()方法執行成功之后,會影響后續的find的執行,因為下一次find會從上次匹配成功的位置開始繼續查找,如果不想這樣可以使用reset()方法復原匹配器的狀態。
例子
import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatcherTest { public static void main(String[] args){ Pattern pattern = Pattern.compile("\\d{3,5}"); String charSequence = "123-34345-234-00"; Matcher matcher = pattern.matcher(charSequence); //雖然匹配失敗,但由於charSequence里面的"123"和pattern是匹配的,所以下次的匹配從位置4開始 print(matcher.matches()); //測試匹配位置 matcher.find(); print(matcher.start()); //使用reset方法重置匹配位置 matcher.reset(); //第一次find匹配以及匹配的目標和匹配的起始位置 print(matcher.find()); print(matcher.group()+" - "+matcher.start()); //第二次find匹配以及匹配的目標和匹配的起始位置 print(matcher.find()); print(matcher.group()+" - "+matcher.start()); //第一次lookingAt匹配以及匹配的目標和匹配的起始位置 print(matcher.lookingAt()); print(matcher.group()+" - "+matcher.start()); //第二次lookingAt匹配以及匹配的目標和匹配的起始位置 print(matcher.lookingAt()); print(matcher.group()+" - "+matcher.start()); } public static void print(Object o){ System.out.println(o); } }
結果:
false 4 true 123 - 0 true 34345 - 4 true 123 - 0 true 123 - 0