You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java解析标签行时如何正确截取子串 修复substring索引越界问题

错误原因

你的代码抛出字符串索引越界,核心是两处逻辑错误:

  • 运算符位置错误:line.indexOf("<"+1 把+1写在了indexOf参数内部,这是触发索引越界的核心原因——该写法等价于查找字符串"<1"的位置,匹配失败会返回-1,后续基于-1计算截取位置就会出现负数索引,触发越界。正确逻辑是先拿到</>的索引值,再对索引值+1。
  • 闭合标签定位错误:提取value时用line.indexOf("<")只会拿到行首开标签的<位置,不是值后面闭合标签的<,截取范围完全错误。
修正逻辑与代码

逐行解析这类简单标签的固定索引计算规则:

  1. 定位开标签起始符<的位置,记为tagStart
  2. 定位开标签结束符>的位置,记为tagOpenEnd,两个位置之间的内容就是key
  3. 从tagOpenEnd位置往后查找闭合标签的起始符<,记为tagCloseStart,tagOpenEnd和tagCloseStart之间的内容就是value
  4. 增加基础格式校验,遇到非法标签行直接跳过,避免越界

修正后的可运行代码:

import java.io.BufferedReader;
import java.io.FileReader;

public class SimpleTagParser {
    public static void main(String[] args) throws Exception {
        // 替换为你的实际文件路径
        BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            // 跳过空行
            if (line == null || line.isBlank()) {
                continue;
            }
            line = line.trim();
            if (line.startsWith("<")) {
                int tagStart = line.indexOf("<");
                int tagOpenEnd = line.indexOf(">");
                // 校验开标签合法性
                if (tagStart == -1 || tagOpenEnd == -1 || tagOpenEnd <= tagStart) {
                    System.err.println("跳过非法开标签行: " + line);
                    continue;
                }
                String key = line.substring(tagStart + 1, tagOpenEnd);
                
                // 从开标签结束位置往后找闭合标签
                int tagCloseStart = line.indexOf("<", tagOpenEnd + 1);
                if (tagCloseStart == -1 || tagCloseStart <= tagOpenEnd + 1) {
                    System.err.println("跳过无闭合标签行: " + line);
                    continue;
                }
                String value = line.substring(tagOpenEnd + 1, tagCloseStart);
                
                // 此处替换为你自己的key/value业务处理逻辑
                System.out.printf("提取结果 -> key: %s, value: %s%n", key, value);
            }
        }
        bufferedReader.close();
    }
}
运行验证

针对你给出的三行示例文本,运行后输出完全符合预期:

提取结果 -> key: accountName, value: fname LName
提取结果 -> key: accountNumber, value: 12345678912
提取结果 -> key: accountOpenedDate, value: 20200218

提示:上述字符串匹配解析仅适用于单行单标签、无属性、无嵌套的简单文本场景。如果后续需要解析复杂XML结构,直接使用JDK内置的StAX、DOM等正规XML解析组件,不要手写字符串匹配,避免出现解析错误。

内容的提问来源于stack exchange,提问作者Dxlmontic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:12:17