如何在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
相关产品推荐
相关产品推荐

