Java字符串嵌套拼接的问题_Java处理字符串搜索嵌套结构的方法_深圳达内龙岗校区...

Java处理字符串搜索嵌套结构的方法_深圳达内龙岗校区

时间:2017-07-31 10:14

发布:深圳Java培训班

来源:达内新闻

分享到:

在用Java分析HTML文本时,如果要取出有嵌套结构的节点之间的内容,不能直接用正则表达式来处理,因为Java所带的正则表达式不支持嵌套结构的描述,虽然Perl、.Net、PHP可以支持。这时可以先用正则表达式找出节点在字符串中的位置,然后对节点进行匹配处理,取出匹配节点之间的内容,实现对嵌套结构的处理。

例如要从

prename=codeclass=javadata=divdivabcddiv/divforminputtype=buttonvalue=submit//form/div/divdiv1234/div中取出div/div之间的内容,希望返回两个字符串

prename=codeclass=javadivabcddiv/divform

inputtype=buttonvalue=submit//form/divprename=codeclass=html和1234。

源代码如下:

为了记录节点在字符串中的值和位置,先定义一个类,保存这些信息:

publicclassTag{

publicTag(Stringvalue,intbeginPos,intendPos){ super();

this.value=value;

this.beginPos=beginPos;

this.endPos=endPos;

}

privateStringvalue;

privateintbeginPos;

privateintendPos;

publicStringgetValue(){

returnvalue;

}

publicvoidsetValue(Stringvalue){

this.value=value;

}

publicintgetBeginPos(){

returnbeginPos;

}

publicvoidsetBeginPos(intbeginPos){

this.beginPos=beginPos;

}

publicintgetEndPos(){

returnendPos;

}

publicvoidsetEndPos(intendPos){

this.endPos=endPos;

}

}

从字符串中获取节点之间内容的函数如下:

/**

*获取字符串之间的内容,如果包含嵌套,则返回最外层嵌套内容 *

*@paramdata

*@paramstag起始节点串

*@parametag结束节点串

*@return

*/

publicListStringget(Stringdata,Stringstag,Stringetag){ //存放起始节点,用于和结束节点匹配

StackTagwork=newStackTag();

//保存所有起始和结束节点

ListTagallTags=newArrayListTag();

//在元字符前加转义符

Stringnstag=stag.replaceAll(([\*\.\+\(\]\[\?\{\}\^\$\|\\]),\\$1); Stringnetag=etag.replaceAll(([\*\.\+\(\]\[\?\{\}\^\$\|\\]),\\$1); Stringreg=((?:+nstag+)|(?:+netag+));

Patternp=Pattern.compile(reg,Pattern.CASE_INSENSITIVE|Pattern.MULTILINE); Matcherm=p.matcher(data);

while(m.find()){

Tagtag=newTag(m.group(0),m.start(),m.end()); allTags.add(tag);

}

//保存开始结束节点之间的内容,不含节点

ListStringresult=newArrayListString();

for(Tagt:allTags){

if(stag.equalsIgnoreCase(t.getValue())){

work.push(t);

}elseif(etag.equalsIgnoreCase(t.getValue())){ //如果栈已空,则表示不匹配

if(work.empty()){

thrownewRuntimeException(pos+t.getBeginPos()+tagnotmatchstarttag.); }

Tagotag=work.pop();

//如果栈为空,则匹配

if(work.empty()){

Stringsub=data.substring(otag.getEndPos(),t.getBeginPos()); result.add(sub);

}

}

}

//如果此时栈不空,则有不匹配发生

if(!work.empty()){

Tagt=work.pop();

thrownewRuntimeException(tag+t.getValue()+notmatch.); }

returnresult;

}

函数返回节点之间内容串组成的列表。

例如 调用 get(data,div, /div) 返回含有两个元素的列表,元素分别为divabcddiv/divforminputtype=buttonvalue=//form/div,1234需要注意的是如果节点含有正则表达式的元字符,需要在元字符前加转义符\,源代码中第16,17行实现此功能。

达内深圳校区温馨提示:如果你在阅读文章时碰到什么不清楚或不明白的地方,可以进行在线咨询;如果你需要报名,也可以通过在线预约,我们将免费为你安排,或者关注深圳达内微信公众平台:tarenasz(更多内容请点击:深圳java培训)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值