日期:2014-05-20  浏览次数:20763 次

正则表达式能搞定这个不?
String str="<u>sdf<i>ewr<b>3<4</b>43>24</i>234<>234</u>"
\
我要取到任意html标签中的内容,这里是 sdf ewr 3<4 43>24 234<>234 我就是问正则能不能搞的定,不要说其它的。。。

------解决方案--------------------
引用:
不是的,因为这个html在网页上是可以展示的,而我是要将htm转成word,有问题是u标签里如果还有其它标签的话,这个u标签是无效的,到word中是没有效果的,所以之前我要把us标签中的内容一个一个加上才可以。

楼主就等于要把u标签里面的纯文本的地方都要加上u标签了这个就比较复杂了不关是正则的问题还要一些逻辑处理嗯 我目前是用jsoup+正则搞定的,写正则写不出来没办法。。。就想知道正则行不行,是不是偶能力有限。。。
正则也是可以的就是逻辑上复杂了一点要进行下递归添加刚有空就写了下

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>");
}
}