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

使用Scanner.next()获取指定n个字符时遇InputMismatchException求助

解决Scanner解析固定长度含空白字符时的InputMismatchException问题

首先,你遇到的InputMismatchException核心原因是Scanner的next(Pattern)方法会自动跳过默认分隔符(空白类字符),且仅匹配连续的"token"序列,这和你想要获取包含空白的固定长度字符段的需求完全冲突。另外,如果输入剩余字符长度不足pattern要求的长度,也会触发这个异常。

下面给你两种实用的解决方案:

方案1:直接用String的substring方法(最简洁高效)

既然需求是按固定字符数分割,直接操作字符串是最不容易出错的方式:

String input = "21 SPAN 1101"; // 假设输入总长度符合你的分段要求
// 按索引截取,注意是左闭右开的区间规则
String segment1 = input.substring(0, 4);    // 取前4个字符
String segment2 = input.substring(4, 10);   // 从第4位开始取6个字符(4到10共6位)
String segment3 = input.substring(10, 15);  // 从第10位开始取5个字符
String segment4 = input.substring(15);      // 取剩余的最后4个字符

// 验证输出
System.out.println("Segment 1: '" + segment1 + "'");
System.out.println("Segment 2: '" + segment2 + "'");
System.out.println("Segment 3: '" + segment3 + "'");
System.out.println("Segment 4: '" + segment4 + "'");

小提示:使用substring前最好先检查输入字符串的总长度是否满足截取需求,避免抛出IndexOutOfBoundsException。

方案2:用Scanner的findInLine方法(保留Scanner操作逻辑)

如果一定要基于Scanner实现,可以用findInLine(Pattern)方法,它不会自动跳过分隔符,会从当前扫描位置开始严格匹配指定模式:

import java.util.Scanner;
import java.util.regex.Pattern;

public class ScannerFixedLengthParser {
    public static void main(String[] args) {
        String input = "21 SPAN 1101";
        Scanner scanner = new Scanner(input);
        
        // 定义固定长度的匹配模式,点号默认不匹配换行,需要的话可加Pattern.DOTALL参数
        Pattern len4 = Pattern.compile(".{4}");
        Pattern len6 = Pattern.compile(".{6}");
        Pattern len5 = Pattern.compile(".{5}");
        
        String segment1 = scanner.findInLine(len4);
        String segment2 = scanner.findInLine(len6);
        String segment3 = scanner.findInLine(len5);
        String segment4 = scanner.findInLine(len4);
        
        // 验证输出
        System.out.println("Segment 1: '" + segment1 + "'");
        System.out.println("Segment 2: '" + segment2 + "'");
        System.out.println("Segment 3: '" + segment3 + "'");
        System.out.println("Segment 4: '" + segment4 + "'");
        
        scanner.close();
    }
}

再说说为什么原来的next(Pattern)会报错

  • Scanner默认把空白作为分隔符,调用next()系列方法时,会先跳过所有空白字符,再尝试匹配模式,这直接导致你无法获取包含开头空白的字符段。
  • 如果输入剩余的字符长度不够pattern要求的长度,Scanner找不到符合要求的序列,就会抛出InputMismatchException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:17