Java 从文件读取的行生成子字符串

Java 从文件读取的行生成子字符串,java,string,substring,Java,String,Substring,因此,我试图读取一个.txt文件,找到html标记的所有实例,将开始标记推到堆栈中,然后在找到结束标记时将其弹出。现在,我得到以下行的字符串越界异常: if(scan.next().startsWith("</", 1)) { toCompare = scan.next().substring(scan.next().indexOf('<'+2), scan.next().indexOf('>'));

因此,我试图读取一个.txt文件,找到html标记的所有实例,将开始标记推到堆栈中,然后在找到结束标记时将其弹出。现在,我得到以下行的字符串越界异常:

    if(scan.next().startsWith("</", 1))
            {
                toCompare = scan.next().substring(scan.next().indexOf('<'+2), scan.next().indexOf('>'));
                tempString = htmlTag.pop();
                if(!tempString.equals(toCompare))
                {
                    isBalanced = false;
                }
            }
            else if(scan.next().startsWith("<"))
            {
                tempString = scan.next().substring(scan.next().indexOf('<'+1), scan.next().indexOf('>'));
                htmlTag.push(tempString);
            }

那么我的比较呢?

您的代码中有两个主要问题:

  • 您调用的
    scan.next()
    太多了,正如您所料,这会将扫描仪移动到下一个令牌。因此,最后一个将丢失并消失

  • .indexOf('Remove
    else
    operator。如果您已经修复了@Pshemo告诉您的内容,那么不要奇怪
    str.substring(str.indexOf('')
    将始终是一个空字符串。
    str.indexOf('当然所有的
    scan.next()
    调用正在转移到下一个字符串。这就是为什么将该方法命名为next,以获取下一个令牌。感谢所有人的帮助。我昨晚最终修复了它。我刚刚制作了tempString=scan.next(),并用它进行了所有计算。
        toCompare = scan.next()
    
    public String extract(final String str) {
        if (str.startsWith("</")) {
            return extract(str, 2);
        } else if (str.startsWith("<")) {
            return extract(str, 1);
        }
        return str;
    }
    
    private String extract(final String str, final int offset) {
        return str.substring(str.indexOf('<') + offset, str.lastIndexOf('>'));
    }
    
    final String token = scan.next();
    if (token.startsWith("</")) { // removed the second argument
        final String currentTag = extract(token); // renamed variable
        final String lastTag = htmlTag.pop(); // introduced a new temporary variable
        if (!lastTag.equals(currentTag)) {
            isBalanced = false;
        }
    }
    else if (token.startsWith("<")) {
        htmlTag.push(extract(token)); // no need for a variable here
    }