1. 程式人生 > >Java Matcher類appendReplacement和appendTail方法的區別

Java Matcher類appendReplacement和appendTail方法的區別

public static void main(String[] args) {
		String str = "測試替換手機號15212793109哇哈哈18909801234歐米茄";
		System.out.println("<<<替換前:"+str);
		str  =	hideAllPhoneNum(str);
		System.out.println("<<<替換後:"+str);
	}
/**
	 * 隱藏並替換字串中所有的手機號
	 * @param contentStr
	 * @return
	 */
	public static String hideAllPhoneNum(String contentStr){
		Pattern pattern =Pattern.compile("((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}");
		Matcher matcher = pattern.matcher(contentStr);
		StringBuffer sb = new StringBuffer();
		try {
			while(matcher.find()) {
				String phoneStr = matcher.group();
				phoneStr = phoneStr.substring(0, 3) + "****" + phoneStr.substring(7, phoneStr.length());
				matcher.appendReplacement(sb,phoneStr);
			}
			System.out.println("執行appendTail前:"+sb.toString());
			matcher.appendTail(sb);
			System.out.println("執行appendTail後:"+sb.toString());
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return sb.toString();
	}

執行結果:


簡要說明一下兩個方法的用法:

appendReplacement方法:sb是一個StringBuffer,replaceContext待替換的字串,這個方法會把匹配到的內容替換為replaceContext,並且把從上次替換的位置到這次替換位置之間的字串也拿到,然後,加上這次替換後的結果一起追加到StringBuffer裡(假如這次替換是第一次替換,那就是隻追加替換後的字串啦)。

appendTail方法:sb是一個StringBuffer,這個方法是把最後一次匹配到內容之後的字串追加到StringBuffer中。

兩個方法一起使用就可以達到所有替換或者替換第一個:

所有替換:

  1. while(m.find()){  
  2.     m.appendReplacement(sb,replaceContext);  
  3. }  
  4. .appendTail(sb);  
替換第一個:
  1. if (matcher.find()){  
  2.     matcher.appendReplacement(sb, replaceContext);  
  3. }  
  4. matcher.appendTail(sb);