Java新手求助:提取Routing/Account对应数值生成键值对Map
修复代码并实现PDF文本的Routing/Account键值对提取
原代码的问题点
- 重复定义
aPattern和aMatcher变量,会直接导致编译失败 if条件里的rMatcher从未定义,属于语法错误- 正则仅匹配了"account"和"routing"关键词,未处理紧随其后的整数值
- 异常信息描述错误(写的是找不到zip或手机号,实际目标是routing和account)
修正后的完整实现
import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PdfDataExtractor { public static Map<String, String> getRoutingAndAccount(String pdfExtractedText) { Map<String, String> keyValuePairs = new HashMap<>(); // 匹配account关键词+紧邻整数(兼容大小写、中间的空格/冒号) String accountPatternStr = "(?i)account\\s*:?\\s*(\\d+)"; Matcher accountMatcher = Pattern.compile(accountPatternStr).matcher(pdfExtractedText); if (accountMatcher.find()) { keyValuePairs.put("account", accountMatcher.group(1)); } else { throw new RuntimeException("PDF中未找到account号码"); } // 匹配routing关键词+紧邻整数 String routingPatternStr = "(?i)routing\\s*:?\\s*(\\d+)"; Matcher routingMatcher = Pattern.compile(routingPatternStr).matcher(pdfExtractedText); if (routingMatcher.find()) { keyValuePairs.put("routing", routingMatcher.group(1)); } else { throw new RuntimeException("PDF中未找到routing号码"); } return keyValuePairs; } // 测试用例 public static void main(String[] args) { // 模拟从PDF提取的文本 String sampleText = "Routing Number: 123456789\nMy Account: 9876543210"; Map<String, String> result = getRoutingAndAccount(sampleText); System.out.println("提取结果: " + result); } }
代码说明
- 正则里的
(?i)开启大小写不敏感匹配,\\s*:?\\s*处理关键词和数字之间可能的空格、冒号分隔符,(\\d+)捕获目标整数值 - 每个关键词使用独立的Matcher,避免变量冲突
- 分别校验两个号码的存在性,抛出明确的异常信息
- 返回的Map直接以"routing"和"account"为键,对应值为提取到的数字字符串(用字符串存储避免长整数溢出问题)
内容的提问来源于stack exchange,提问作者IA Nadir
相关产品推荐
相关产品推荐

