今天工作時遇到一個問題, 用正則處理html標簽時不知該如何下手。還好有Matcher幫助解決了問題。
需求如下:
例如有如下html文章內容:
<p><a href="www.baidu.com">百度的鏈接</a>; 這是一個百度的鏈接。 <a href="www.jiakaobaodian.com">駕考寶典的鏈接</a>這是一個駕考寶典的鏈接</p>;
在我們做文章內鏈的時候, 往往摻雜了一些我們不想要的鏈接, 如上所示我們只想保留www.jiakaobaodian.com 的鏈接, 如下是我們希望得到的:
<p>這是一個百度的鏈接。<a href="www.jiakaobaodian.com">駕考寶典的鏈接</a>這是一個駕考寶典的鏈接</p>;
說白了就是去掉自己不需要的標簽, 但是保留標簽中的文本。
開始嘗試用Jsoup,Dom4j 一類的解析這段html, 但是后面在刪除標簽的時候都遇到了問題, 最后嘗試使用Matcher中的appendReplacement和appendReplacement才解決問題。
1, 使用實例:
![Image[4] Image[4]](https://images2017.cnblogs.com/blog/799093/201709/799093-20170929232123059-269054375.png)
輸出結果是將沒有匹配到的a標簽都remove掉且保留了標簽中的文字。
結果如下圖:
![Image(1)[4] Image(1)[4]](https://images2017.cnblogs.com/blog/799093/201709/799093-20170929232124075-1729975078.png)
下面在講一個簡單的案例:
public static void main(String[] args) throws Exception{
??? Pattern p = Pattern.compile("(\\w+)%(\\d+)");
??? Matcher m = p.matcher("前ab%12中cd%34后");
??? StringBuffer s = new StringBuffer();
??? while (m.find()) {
??????? m.appendReplacement(s, "app");
??? }
??? System.out.println(s);// 前app中app
??? m.appendTail(s);
??? System.out.println(s);// 前app中app后
}
先看下這段正則的匹配情況:
![Image(2)[4] Image(2)[4]](https://images2017.cnblogs.com/blog/799093/201709/799093-20170929232124512-335267715.png)
圖中彩色的部分就是匹配到情況, 遇到這種需要正則匹配且時時看到結果的, 大家可以到: https://regex101.com/ 上測試。
然后看下輸出結果:

2, 解釋說明:
public Matcher appendReplacement(StringBuffer sb, String replacement)
將當前匹配子串替換為指定字符串,并將從上次匹配結束后到本次匹配結束后之間的字符串添加到一個StringBuffer對象中,最后返回其字符串表示形式。
注意:對于最后一次匹配,其后的字符串并沒有添加入StringBuffer對象中,若需要這部分的內容需要使用appendTail方法。
public StringBuffer appendTail(StringBuffer sb)
將最后一次匹配工作后剩余的字符串添加到一個StringBuffer對象里。
更多內容大家可以查看Matcher類。
參考:http://www.cnblogs.com/SQP51312/p/6134324.html