日期:2014-05-20 浏览次数:20797 次
String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>"\
public static void main(String[] args) throws Exception {
String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>";
System.out.println(str);
Pattern p=Pattern.compile("<u>(.*?)</u>");
Matcher m=p.matcher(str);
if(m.find()){
StringBuilder sb=new StringBuilder();
str=m.group(1);//获得u标签里的内容
replace(str,sb);//内容中纯文本的地方都包上u标签
System.out.println(sb);
}
}
private static void replace(String str,StringBuilder sb){
Matcher m=Pattern.compile("<([^u]+)>(.*?)</\\1>").matcher(str);
int end=0;//这个用于记录上一次匹配的结尾
while(m.find()){
int start=m.start();
//如果说匹配的起始小于上一次的结尾说明前面已经是纯文本了就要用u标签包起来
if(start>end){
sb.append("<u>").append(str.substring(end,start)).append("</u>");
}
//把原来的标签内容原样添加上去
sb.append("<").append(m.group(1)).append(">");
//如果标签之中的内容仍然有标签那么递归调用
if(m.group(2).matches(".*<([^u]+)>(.*?)</\\1>.*")){
replace(m.group(2),sb);
}else{//没有标签了就是纯文本直接用u标签包上
sb.append("<u>").append(m.group(2)).append("</u>");
}
//在把原来的标签内容结尾原样加上上去
sb.append("</").append(m.group(1)).append(">");
//改变上一次的匹配结尾用于最后的内容添加
end=m.end();
}
//当最后匹配的内容未到末尾时说明后面还有纯文本再把后面的内容用u标签抱起来
if(end<str.length()-1){
sb.append("<u>").append(str.substring(end)).append("</u>");
}
}