
本文介绍使用正则表达式精准提取PDF或文本中“account”和“routing”关键词后紧跟的数字,并将其封装为Map结构,实现字符串标签到对应整型数值的可靠映射。
本文介绍使用正则表达式精准提取pdf或文本中“account”和“routing”关键词后紧跟的数字,并将其封装为`map
在处理银行票据、PDF解析结果或OCR识别文本时,常需从非结构化内容中定位关键字段(如账户号、路由号)。这些字段通常以“account: 12345”或“routing number 1122334455”等形式出现,其后紧邻数字,但中间可能夹杂空格、冒号、换行或少量无关字符。直接匹配固定格式易失效,而利用正向先行断言((?可精准锚定关键词后的数字区域。
以下为完整实现方案:
import java.util.*;
import java.util.regex.*;
public class Bank {
// 预编译正则:匹配“account”后0–10个非数字字符(如空格、冒号、换行等),再捕获连续数字
private static final Pattern accountPattern
= Pattern.compile("(? accountInfo = extractAccountInfo(pdfText);
System.out.println(accountInfo); // {account=987654321, routing=21000021}
}
public static Map<string long> extractAccountInfo(String text) {
Map<string long> result = new HashMap();
Matcher accountMatcher = accountPattern.matcher(text);
Matcher routingMatcher = routingPattern.matcher(text);
// 分别查找,确保两个字段均存在
if (accountMatcher.find() && routingMatcher.find()) {
result.put("account", Long.parseLong(accountMatcher.group(1)));
result.put("routing", Long.parseLong(routingMatcher.group(1)));
} else {
throw new IllegalArgumentException(
"Failed to extract both 'account' and 'routing' numbers from text."
);
}
return result;
}
}</string></string>
✅ 关键设计说明:
- \D{0,10} 允许关键词与数字间最多10个非数字字符(含空格、标点、制表符、换行),兼顾常见排版变体;
- group(1) 显式获取捕获组内的纯数字,避免误取先行断言部分;
- 使用 Long 而非 int,防止长路由号(如9位)或大账户号溢出;
- 正则预编译为 static final 字段,提升多次调用性能。
⚠️ 注意事项:
- 若文本中存在多个匹配项(如多个账户号),上述代码仅返回首次出现的结果。如需全部匹配,请改用循环 while(matcher.find()) 并收集;
- 对大小写不敏感(CASE_INSENSITIVE),但若原文含连字符(如 routing-number),建议扩展正则为 routing[\s\-:]*number?;
- 实际PDF文本提取(如通过 Apache PDFBox 或 Tesseract OCR)需先完成文本清洗(去除多余换行、合并断裂行),再传入本方法。
该方案简洁、健壮、可扩展,是金融文本结构化提取的典型实践。










