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培训)