Java解析标签行时如何正确截取子串 修复substring索引越界问题
错误原因
你的代码抛出字符串索引越界,核心是两处逻辑错误:
- 运算符位置错误:
line.indexOf("<"+1把+1写在了indexOf参数内部,这是触发索引越界的核心原因——该写法等价于查找字符串"<1"的位置,匹配失败会返回-1,后续基于-1计算截取位置就会出现负数索引,触发越界。正确逻辑是先拿到</>的索引值,再对索引值+1。 - 闭合标签定位错误:提取value时用
line.indexOf("<")只会拿到行首开标签的<位置,不是值后面闭合标签的<,截取范围完全错误。
修正逻辑与代码
逐行解析这类简单标签的固定索引计算规则:
- 定位开标签起始符
<的位置,记为tagStart - 定位开标签结束符
>的位置,记为tagOpenEnd,两个位置之间的内容就是key - 从
tagOpenEnd位置往后查找闭合标签的起始符<,记为tagCloseStart,tagOpenEnd和tagCloseStart之间的内容就是value - 增加基础格式校验,遇到非法标签行直接跳过,避免越界
修正后的可运行代码:
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
相关产品推荐
相关产品推荐

