java正则匹配html片段,并取得标签中的内容




        最近java群好友发来一个html代码,要帮忙匹配查找html代码里面特定的内容:

        代码如下:

Html代码   收藏代码
  1. <dl>  
  2.   
  3. <dd>  
  4.     <span class="gray6"><span class="padl27"></span>代:</span>2013年</dd>  
  5.   
  6. <dd>  
  7.     <span class="gray6"><span class="padl27"></span>向:</span>东北</dd>  
  8.   
  9. <dd>  
  10.     <span class="gray6"><span class="padl27"></span>层:</span>第10层(共33层)</dd>  
  11.   
  12. <dd>  
  13.     <span class="gray6 "><span class="padl27"></span>构:</span>平层</dd>  
  14.   
  15. <dd>  
  16.     <span class="gray6"><span class="padl27"></span>修:</span>毛坯</dd>  
  17.   
  18. <dd>  
  19.     <span class="gray6">住宅类别:</span>普通住宅</dd>  
  20.   
  21. <dd>  
  22.     <span class="gray6">建筑类别:</span>板楼</dd>  
  23.   
  24. <dd>  
  25.     <span class="gray6 ">产权性质:</span>个人产权</dd>  
  26.   
  27. <dd>  
  28.   
  29. </dl>  

 

伦理片 http://www.dotdy.com/

     需求为找到 span中内容为:住宅类别的中后面的内容,即获取“普通住宅”文本,通过分析发现如果直接匹配到具体的

Html代码   收藏代码
  1. <dd>  <span class="gray6">住宅类别:</span>普通住宅</dd>  

 

 发现会有点麻烦, 因为以<dd>开头 并以</dd>结束的模式如果写的不好会匹配整个大段的html(去掉开头和结尾的dl)。所以匹配模式改为先匹配每一个dd中的内容, 

 则模式为:

Java代码   收藏代码
  1. String regex2 = "<dd.*?>([\\s\\S]*?)</dd>";  

 

 然后将匹配的dd字符串在去匹配span查找是否存在“住宅类别”文字。如果匹配说明是我们需要查找的

 匹配span的模式为:

Java代码   收藏代码
  1. String regex3 = "<span.*?>住宅类别";  

 如果找到匹配的dd则将dd标签和span标签全部替换掉:思路如下:

Java代码   收藏代码
  1. dd=dd.replaceAll("<dd>""");//替换开头的dd  
  2. dd=dd.replaceAll("</dd>""");//替换结束的订单  
  3. dd=dd.replaceAll("<span.*?</span>""");//替换span标签  

  

 完整代码如下:

 由于对正则不是很熟悉,纯粹的摸索。如果有更好的实现方法,往各位看官不吝赐教。

 

Java代码   收藏代码
  1. public static void main(String[] args) {  
  2.           
  3.         String oriStr = "<dl>"+  
  4.                 "<dd>"+  
  5.                 "    <span class=\"gray6\">年<span class=\"padl27\"></span>代:</span>2013年</dd>"+  
  6.                 "<dd>"+  
  7.                 "    <span class=\"gray6\">朝<span class=\"padl27\"></span>向:</span>东北</dd>"+  
  8.                 "<dd>"+  
  9.                 "    <span class=\"gray6\">楼<span class=\"padl27\"></span>层:</span>第10层(共33层)</dd>"+  
  10.                 "<dd>"+  
  11.                 "    <span class=\"gray6 \">结<span class=\"padl27\"></span>构:</span>平层</dd>"+  
  12.                 "<dd>"+  
  13.                 "    <span class=\"gray6\">装<span class=\"padl27\"></span>修:</span>毛坯</dd>"+  
  14.                 "<dd>"+  
  15.                 "    <span class=\"gray6\">住宅类别:</span>普通住宅</dd>"+  
  16.                 "<dd>"+  
  17.                 "    <span class=\"gray6\">建筑类别:</span>板楼</dd>"+  
  18.                 "<dd>"+  
  19.                 "    <span class=\"gray6 \">产权性质:</span>个人产权</dd>"+  
  20.                 "<dd>"+  
  21.                 "</dl>";  
  22.   
  23.         String regex2 = "<dd.*?>([\\s\\S]*?)</dd>";  
  24.         String regex3 = "<span.*?>住宅类别";  
  25.         Pattern pattern2 = Pattern.compile (regex2);  
  26.         Pattern pattern3 = Pattern.compile (regex3);  
  27.         Matcher match2 = pattern2.matcher (oriStr);  
  28.         Matcher match3 = null;  
  29.         while (match2.find ()){//取的每个dd标签  
  30.             String dd = match2.group ();  
  31.             System.out.println(dd);  
  32.             match3 = pattern3.matcher(dd);  
  33.               
  34.             if(match3.find()){//找到dd中含有住宅列别的span 将没用的替换掉  
  35.                 dd=dd.replaceAll("<dd>""");  
  36.                 dd=dd.replaceAll("</dd>""");  
  37.                 dd=dd.replaceAll("<span.*?</span>""");  
  38.                 System.out.println("\n\n\n\n\n找到啦......"+dd+"\n\n\n\n");  
  39.             }  
  40.         }  
  41.           
  42.     }  

 影音先锋电影 http://www.iskdy.com/



### 使用Java正则表达式匹配富文本HTML/XML标签 为了处理富文本HTML或XML标签,可以利用Java的`Pattern`和`Matcher`类来编写相应的正则表达式模式。这些模式能够识别并提取文档内的各种标签结构。 #### 创建正则表达式模式 针对HTML/XML标签的一般形式 `<tag>content</tag>` 或者自闭合标签如 `<img src="image.jpg"/>`,可构建如下所示的正则表达式: ```java String regex = "<([A-Za-z0-9]+)[^>]*>(.*?)<\\/\\1>|<([A-Za-z0-9]+)[^>]*/>"; // 解释: // <([A-Za-z0-9]+) 表示匹配任何由字母或数字组成的标签名,并捕获它 (组1) // [^>]* 匹配除'>'外任意数量字符(即属性) // >(.*?) 匹配最小范围的内容直到遇到下一个结束标记(非贪婪),并将内容捕获起来 (组2) // <\\/\\1 匹配与第一个捕获组相同的关闭标签 // | 或者 // <([A-Za-z0-9]+)[^/]*/> 对于像<img/>这样的单标签也适用,这里再次捕捉标签名为第三组 ``` 此正则表达式支持带参数或多层嵌套的情况[^4]。 #### 应用实例 下面给出一段完整的代码片段展示如何应用上述规则去解析字符串所有的HTML标签: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class HtmlTagExtractor { public static void main(String[] args){ String inputHtml = "<html><head><title>Title Text</title></head><body>" + "<p>This is an example paragraph with <b>bold text</b>.</p>" + "</body></html>"; Pattern pattern = Pattern.compile("<([A-Za-z0-9]+)[^>]*>(.*?)<\\/\\1>|<([A-Za-z0-9]+)[^>]*/>"); Matcher matcher = pattern.matcher(inputHtml); while(matcher.find()){ if(matcher.group(2)!=null){ // 如果存在第二个分组,则表示有起始和终止标签 System.out.println("Found tag: "+matcher.group(1)+", Content:"+matcher.group(2)); }else{ // 否则是单独的标签 System.out.println("Found standalone tag: "+matcher.group(3)); } } } } ``` 这段程序会遍历给定的HTML字符串,并输出找到的所有标签及其内部文本内容。对于不包含内嵌内容标签(例如图像),只会报告它们的名字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值