★ replaceAll ()/appendReplacement()/appendTail():
Matcher 類同時提供了四個將匹配子串替換成指定字串的方法:
- replaceAll()
- replaceFirst()
- appendReplacement()
- appendTail()
public class Test {
/**
* @param args
* @return
* 4
* 1240
* 124067
*/
public static void main(String[] args) {
String string="1234567";
Matcher matcher = Pattern.compile("3(4)5").matcher(string);
if(matcher.find()){
System.out.println(matcher.group(1));
StringBuffer sb = new StringBuffer();
matcher.appendReplacement(sb, matcher.group(1)+"0"); //替換的是整個group()
matcher.appendReplacement(sb, "$0"+"$1"+"_recycle/");
System.out.println(sb);
matcher.appendTail(sb);
System.out.println(sb.toString());
}
}
}
replaceAll() 與 replaceFirst() 的用法都比較簡單,請看上面方法的解釋。我們主要重點瞭解一下 appendReplacement() 和 appendTail() 方法。
appendReplacement(StringBuffer sb, String replacement) 將當前匹配子串替換為指定字串,並且將替換後的子串以及其之前到上次匹配子串之後的字串段添加到一個 StringBuffer 對象裡,而 appendTail(StringBuffer sb) 方法則將最後一次匹配工作後剩餘的字串添加到一個 StringBuffer 對象裡。
例如,有字串 fatcatfatcatfat, 假設既有Regex模式為"cat",第一次匹配後調用 appendReplacement(sb,"dog"), 那麼這時 StringBuffer sb 的內容為 fatdog,也就是 fatcat 中的 cat 被替換為 dog 並且與匹配子串前的內容加到 sb 裡,而第二次匹配後調用 appendReplacement(sb,"dog"),那麼 sb 的內容就變為 fatdogfatdog,如果最後再調用一次 appendTail(sb), 那麼 sb 最終的內容將是
fatdogfatdogfat。
還是有點模糊?那麼我們來看個簡單的程式:
// 該例將把句子裡的"Kelvin"改為"Kevin" import java.util.regex.*; public class MatcherTest{ public static void main(String[] args) throws Exception { // 產生 Pattern 對象並且編譯一個簡單的Regex"Kelvin" Pattern p = Pattern.compile("Kevin"); // 用 Pattern 類的 matcher() 方法產生一個 Matcher 對象 Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in " +"Kelvin Chen's KelvinSoftShop company"); StringBuffer sb = new StringBuffer(); int i=0; // 使用 find() 方法尋找第一個匹配的對象 boolean result = m.find(); // 使用迴圈將句子裡所有的 kelvin 找出並替換再將內容加到 sb 裡 while(result) { i++; m.appendReplacement(sb, "Kevin"); System.out.println("第"+i+"次匹配後 sb 的內容是:"+sb); // 繼續尋找下一個匹配對象 result = m.find(); } // 最後調用 appendTail() 方法將最後一次匹配後的剩餘字串加到 sb 裡; m.appendTail(sb); System.out.println("調用 m.appendTail(sb) 後 sb 的最終內容是 :"+ sb.toString()); } } |