java:count开始和结束标记对

时间:2014-10-29 17:00:02

标签: java

我有以下文字

`h1` text  `/h1`        `i` text  `/i`            `u` text  `/u`  

此处h1 /h1i /iu /u完全存在,因此应传递此文字。现在拿这个文本

`h1` text  `/h1`        `i` text  `/i`            `u` text  `/u  

此处缺少u /u组合。所以上面的文字失败了。

我试过这个

    String startTags[] = {"`b`","`h1`","`h2`","`h3`","`h4`","`h5`","`h6`","`ul`","`li`","`i`","`u`"};
    String endTags[] = {"`/b`","`/h1`","`/h2`","`/h3`","`/h4`","`/h5`","`/h6`","`/ul`","`/li`","`/i`","`/u`"};

        for(int i=0;i<startTags.length;i++){
            if(str.indexOf(startTags[i])!=-1){
                System.out.println(">>>>"+startTags[i]);
                startTagCount++;
            }
            if(str.indexOf(endTags[i])!=-1){System.out.println("+++"+endTags[i]);
                endTagCount++;
            }                
        }

if(startTagCount==endTagCount){
 //TEXT IS OK
}else{
 // TEXT FAILED
}

它传递到文本下方而不是失败

`h5`Is your question about programming? `/h5`
`b` bbbbbbbbbbbbbb`/b`
`b` bbbbbbbbbbbbbb`/b

java中有哪些更好的解决方案或正则表达式?

2 个答案:

答案 0 :(得分:1)

我担心(严格)正则表达式无法解决这个问题,因为你描述的语言不是regular language,它扩展了语言{a n b n },这是一种众所周知的非常规语言。

答案 1 :(得分:0)

如果您关心的是确保所有开始标记都有匹配的结束标记,那么您可以使用正则表达式。

您的代码存在逻辑问题,因为您计算所有开始标记和所有结束标记,但不检查开始标记和结束标记是否实际匹配。 startTagCount和endTagCount变量不够用。我建议使用地图,使用标签类型作为键,值作为计数。打开标签的递增计数,关闭标签的递减计数。扫描完成后检查非零。

这种“语言”的语法是什么?您的方法可能不是正确的验证。例如,此HTML具有匹配的标记计数但无效:

<b><i>Invalid</b></i>