您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)Java處理字符串搜索嵌套結(jié)構(gòu)的方法是什么,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在用Java分析HTML文本時,如果要取出有嵌套結(jié)構(gòu)的節(jié)點之間的內(nèi)容,不能直接用正則表達式來處理,因為Java所帶的正則表達式不支持嵌套結(jié)構(gòu)的描述,雖然Perl、.Net、PHP可以支持。這時可以先用正則表達式找出節(jié)點在字符串中的位置,然后對節(jié)點進行匹配處理,取出匹配節(jié)點之間的內(nèi)容,實現(xiàn)對嵌套結(jié)構(gòu)的處理。
例如要從
<pre name="code" class="java">data=<div><div>abcd<div></div><form><input type='button' value='submit'/></form></div></div><div>1234</div>
中取出<div></div>之間的內(nèi)容,希望返回兩個字符串
<pre name="code" class="java"><div>abcd<div></div><form><input type='button' value='submit'/></form></div><pre name="code" class="html">和1234。
源代碼如下:
為了記錄節(jié)點在字符串中的值和位置,先定義一個類,保存這些信息:
public class Tag { public Tag(String value, int beginPos, int endPos) { super(); this.value = value; this.beginPos = beginPos; this.endPos = endPos; } private String value; private int beginPos; private int endPos; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public int getBeginPos() { return beginPos; } public void setBeginPos(int beginPos) { this.beginPos = beginPos; } public int getEndPos() { return endPos; } public void setEndPos(int endPos) { this.endPos = endPos; } }
從字符串中獲取節(jié)點之間內(nèi)容的函數(shù)如下:
/** * 獲取字符串之間的內(nèi)容,如果包含嵌套,則返回最外層嵌套內(nèi)容 * * @param data * @param stag 起始節(jié)點串 * @param etag 結(jié)束節(jié)點串 * @return */ public List<String> get(String data,String stag, String etag){ // 存放起始節(jié)點,用于和結(jié)束節(jié)點匹配 Stack<Tag> work = new Stack<Tag>(); // 保存所有起始和結(jié)束節(jié)點 List<Tag> allTags = new ArrayList<Tag>(); // 在元字符前加轉(zhuǎn)義符 String nstag = stag.replaceAll("([\\*\\.\\+\\(\\]\\[\\?\\{\\}\\^\\$\\|\\\\])", "\\\\$1"); String netag = etag.replaceAll("([\\*\\.\\+\\(\\]\\[\\?\\{\\}\\^\\$\\|\\\\])", "\\\\$1"); String reg = "((?:"+nstag+")|(?:"+netag+"))"; Pattern p = Pattern.compile(reg, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE); Matcher m = p.matcher(data); while(m.find()){ Tag tag = new Tag(m.group(0),m.start(),m.end()); allTags.add(tag); } // 保存開始結(jié)束節(jié)點之間的內(nèi)容,不含節(jié)點 List<String> result = new ArrayList<String>(); for(Tag t : allTags){ if (stag.equalsIgnoreCase(t.getValue())){ work.push(t); }else if(etag.equalsIgnoreCase(t.getValue())){ // 如果棧已空,則表示不匹配 if (work.empty()){ throw new RuntimeException("pos "+t.getBeginPos()+" tag not match start tag."); } Tag otag = work.pop(); // 如果棧為空,則匹配 if (work.empty()){ String sub = data.substring(otag.getEndPos(), t.getBeginPos()); result.add(sub); } } } // 如果此時棧不空,則有不匹配發(fā)生 if (!work.empty()){ Tag t = work.pop(); throw new RuntimeException("tag "+t.getValue()+ "not match."); } return result; }
函數(shù)返回節(jié)點之間內(nèi)容串組成的列表。
例如 調(diào)用 get(data,"<div>", "</div>") 返回含有兩個元素的列表,元素分別為
<div>abcd<div></div><form><input type='button' value='>'/></form></div>, 1234
需要注意的是如果節(jié)點含有正則表達式的元字符,需要在元字符前加轉(zhuǎn)義符\\,源代碼中第16,17行實現(xiàn)此功能。
以上就是Java處理字符串搜索嵌套結(jié)構(gòu)的方法是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。