成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java處理字符串搜索嵌套結構的方法

開發 后端
在用java分析HTML文本時,如果要取出有嵌套結構的節點之間的內容,不能直接用正則表達式來處理,因為java所帶的正則表達式不支持嵌套結構的描述,雖然Perl、.Net、PHP可以支持。

在用Java分析HTML文本時,如果要取出有嵌套結構的節點之間的內容,不能直接用正則表達式來處理,因為Java所帶的正則表達式不支持嵌套結構的描述,雖然Perl、.Net、PHP可以支持。這時可以先用正則表達式找出節點在字符串中的位置,然后對節點進行匹配處理,取出匹配節點之間的內容,實現對嵌套結構的處理。

例如要從

  1. <pre name="code" class="java">data=<div><div>abcd<div></div><form>
  2. <input type='button' value='submit'/></form></div></div><div>1234</div> 

中取出<div></div>之間的內容,希望返回兩個字符串

  1. <pre name="code" class="java"><div>abcd<div></div><form>
  2. <input type='button' value='submit'/></form></div><pre name="code" class="html">和1234。 

源代碼如下:

為了記錄節點在字符串中的值和位置,先定義一個類,保存這些信息:

  1. public class Tag {  
  2.       
  3.     public Tag(String value, int beginPos, int endPos) {  
  4.         super();  
  5.         this.value = value;  
  6.         this.beginPos = beginPos;  
  7.         this.endPos = endPos;  
  8.     }  
  9.     private String value;  
  10.     private int beginPos;  
  11.     private int endPos;  
  12.     public String getValue() {  
  13.         return value;  
  14.     }  
  15.     public void setValue(String value) {  
  16.         this.value = value;  
  17.     }  
  18.     public int getBeginPos() {  
  19.         return beginPos;  
  20.     }  
  21.     public void setBeginPos(int beginPos) {  
  22.         this.beginPos = beginPos;  
  23.     }  
  24.     public int getEndPos() {  
  25.         return endPos;  
  26.     }  
  27.     public void setEndPos(int endPos) {  
  28.         this.endPos = endPos;  
  29.     }  
  30.       

從字符串中獲取節點之間內容的函數如下:

  1.        /**  
  2.  * 獲取字符串之間的內容,如果包含嵌套,則返回最外層嵌套內容  
  3.  *   
  4.  * @param data        
  5.  * @param stag      起始節點串  
  6.  * @param etag      結束節點串  
  7.  * @return  
  8.  */ 
  9. public List<String> get(String data,String stag, String etag){  
  10.     // 存放起始節點,用于和結束節點匹配  
  11.     Stack<Tag> work = new Stack<Tag>();  
  12.     // 保存所有起始和結束節點  
  13.     List<Tag> allTags = new ArrayList<Tag>();  
  14.       
  15.     // 在元字符前加轉義符  
  16.     String nstag = stag.replaceAll("([\\*\\.\\+\\(\\]\\[\\?\\{\\}\\^\\$\\|\\\\])""\\\\$1");  
  17.     String netag = etag.replaceAll("([\\*\\.\\+\\(\\]\\[\\?\\{\\}\\^\\$\\|\\\\])""\\\\$1");  
  18.       
  19.     String reg = "((?:"+nstag+")|(?:"+netag+"))";  
  20.       
  21.     Pattern p = Pattern.compile(reg, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);  
  22.       
  23.     Matcher m = p.matcher(data);  
  24.       
  25.     while(m.find()){  
  26.         Tag tag = new Tag(m.group(0),m.start(),m.end());  
  27.         allTags.add(tag);  
  28.     }  
  29.     // 保存開始結束節點之間的內容,不含節點  
  30.     List<String> result = new ArrayList<String>();  
  31.       
  32.     for(Tag t : allTags){  
  33.         if (stag.equalsIgnoreCase(t.getValue())){  
  34.             work.push(t);  
  35.         }else if(etag.equalsIgnoreCase(t.getValue())){  
  36.             // 如果棧已空,則表示不匹配  
  37.             if (work.empty()){  
  38.                 throw new RuntimeException("pos "+t.getBeginPos()+" tag not match start tag.");  
  39.             }  
  40.             Tag otag = work.pop();  
  41.             // 如果棧為空,則匹配  
  42.             if (work.empty()){  
  43.                 String sub = data.substring(otag.getEndPos(), t.getBeginPos());  
  44.                 result.add(sub);  
  45.             }  
  46.         }  
  47.           
  48.     }  
  49.       
  50.     // 如果此時棧不空,則有不匹配發生  
  51.     if (!work.empty()){  
  52.         Tag t = work.pop();  
  53.         throw new RuntimeException("tag "+t.getValue()+ "not match.");  
  54.     }  
  55.       
  56.     return result;  
  57.       

函數返回節點之間內容串組成的列表。

例如 調用 get(data,"<div>", "</div>") 返回含有兩個元素的列表,元素分別為

  1. <div>abcd<div></div><form><input type='button' value='>'/></form></div>, 1234 

需要注意的是如果節點含有正則表達式的元字符,需要在元字符前加轉義符\\,源代碼中第16,17行實現此功能。

原文鏈接:http://blog.csdn.net/indexchen/article/details/7236754

【編輯推薦】

  1. Java編程:常見問題匯總
  2. Java迷題:等于,還是不等于?
  3. Java數據庫連接代碼集合
  4. Java編程語言的認識誤區
  5. Java Thread的概述與總結
責任編輯:林師授 來源: indexchen的博客
相關推薦

2009-11-26 16:26:32

PHP字符串mbstr

2010-11-26 09:51:54

MySQL字符串

2011-07-12 16:14:17

2010-06-21 09:48:43

2010-06-04 14:59:06

MySQL數據庫

2009-08-07 14:22:56

C#字符串搜索

2009-06-30 14:16:37

截取字符串

2021-05-18 09:08:18

字符串子串對象

2022-09-26 00:00:02

字符串數據結構

2010-08-04 11:23:15

Flex字符串

2010-04-27 12:26:21

Unix字符串

2020-09-03 10:13:49

JavaScript字符串pad

2010-07-14 16:35:52

Perl字符串處理函數

2023-10-18 07:55:41

Python字符串

2019-08-12 14:25:09

編程算法PythonJavaScript

2020-05-12 08:53:15

JavaScript字符串處理庫

2010-11-26 11:20:31

MySQL字符串處理函

2021-08-26 11:41:50

字符串String.jsVoca

2021-03-08 08:23:24

Java字符串截取

2016-12-30 13:32:24

字符串算法代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久久久久久久九 | 日韩免费av | www.精品国产| 国户精品久久久久久久久久久不卡 | 久久av网站 | 日韩精品免费视频 | 国产精品一区二区精品 | 欧美成人免费在线 | 欧美精品中文字幕久久二区 | 亚洲精品视频在线看 | av在线免费观看网站 | www视频在线观看 | 国产精品久久久久aaaa九色 | 国产乱码精品一区二区三区忘忧草 | 亚洲第一网站 | 天天玩夜夜操 | 99在线免费观看 | 成人免费xxxxx在线视频 | 久久一视频 | 久久国产区 | 97精品国产一区二区三区 | 欧美视频一区二区三区 | 国产精品久久 | 欧美爱爱视频网站 | 天天澡天天狠天天天做 | 精品少妇一区二区三区在线播放 | 中文字幕韩在线第一页 | a毛片 | 狠狠综合久久av一区二区小说 | 欧美精品一二三 | 九九热re | 亚洲毛片在线观看 | 中文字幕一级 | 99热视 | 91麻豆精品国产91久久久久久久久 | 久久精品国产一区二区三区 | 一区二区三区国产视频 | 亚洲欧洲小视频 | 日韩一区二区在线视频 | 日本a在线| 精品国产伦一区二区三区观看说明 |