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

如何在Java中使用文件扫描器提取特定前缀后的数字并分类存储?

解决Scanner读取带前缀数字的问题

嘿,我明白你遇到的问题了——想用Java的Scanner从文件里把带!和?前缀的数字分别存进数组,但之前用findWithinHorizon("!", 3)拿到的是感叹号本身,没拿到后面的数字对吧?别担心,我给你两种简单有效的解决方案:

方法一:利用正则匹配完整的带前缀数字串

这种方法通过正则表达式直接匹配!数字或?数字的完整格式,然后提取数字部分:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.MatchResult;
import java.io.File;
import java.io.FileNotFoundException;

public class NumberSplitter {
    public static void main(String[] args) {
        List<Long> exclamationNumbers = new ArrayList<>();
        List<Long> questionNumbers = new ArrayList<>();
        
        try (Scanner diskScanner = new Scanner(new File("your_file.txt"))) {
            // 正则匹配 !+数字 或 ?+数字 的完整串
            String pattern = "(!\\d+)|(\\?\\d+)";
            
            while (diskScanner.findInLine(pattern) != null) {
                MatchResult matchResult = diskScanner.match();
                String matchedStr = matchResult.group();
                
                if (matchedStr.startsWith("!")) {
                    // 去掉!前缀,转换为long类型
                    long num = Long.parseLong(matchedStr.substring(1));
                    exclamationNumbers.add(num);
                } else if (matchedStr.startsWith("?")) {
                    long num = Long.parseLong(matchedStr.substring(1));
                    questionNumbers.add(num);
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }
        
        // 打印结果验证
        System.out.println("!前缀数字数组: " + exclamationNumbers);
        System.out.println("?前缀数字数组: " + questionNumbers);
    }
}

代码说明:

  • (!\\d+)|(\\?\\d+) 是核心正则:!\\d+匹配感叹号加一串数字,\\?\\d+匹配问号加一串数字,|表示“或”的关系。
  • findInLine(pattern) 会在当前行内查找匹配的字符串,循环直到没有匹配项为止。
  • 用substring(1)去掉前缀符号,再转成long存入对应数组。

方法二:按空格分割读取每个Token

因为你的文件内容是用空格分隔每个带前缀的数字(比如!345 ?298),所以可以直接按空格分割读取每个Token,再判断前缀:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.io.File;
import java.io.FileNotFoundException;

public class NumberSplitter {
    public static void main(String[] args) {
        List<Long> exclamationNums = new ArrayList<>();
        List<Long> questionNums = new ArrayList<>();
        
        try (Scanner diskScanner = new Scanner(new File("your_file.txt"))) {
            while (diskScanner.hasNext()) {
                String token = diskScanner.next();
                // 获取第一个字符作为前缀
                char prefix = token.charAt(0);
                // 截取前缀后的数字部分
                String numStr = token.substring(1);
                
                try {
                    long num = Long.parseLong(numStr);
                    if (prefix == '!') {
                        exclamationNums.add(num);
                    } else if (prefix == '?') {
                        questionNums.add(num);
                    }
                } catch (NumberFormatException e) {
                    // 处理格式错误的Token(比如!abc这种)
                    System.err.println("无效的数字格式: " + token);
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }
        
        System.out.println("!前缀数字数组: " + exclamationNums);
        System.out.println("?前缀数字数组: " + questionNums);
    }
}

代码说明:

  • diskScanner.next() 每次读取一个空格分隔的Token(比如!345或?298)。
  • 通过token.charAt(0)判断前缀类型,substring(1)提取数字字符串后转成long。
  • 加入了异常处理,避免遇到非数字格式的Token导致程序崩溃。

为什么你之前的代码不行?

你用的diskScanner.findWithinHorizon("!", 3)是查找匹配字符串"!"的内容,所以只会返回!本身,而不会自动捕获后面的数字。要拿到完整的带前缀数字,必须用正则表达式匹配包含数字的完整格式才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:36:45