
本文介绍使用Java正则表达式精准提取PDF或文本中紧随“account”和“routing”关键词之后的数字,并将其封装为Map结构,支持大小写不敏感匹配及标签与数字间的灵活分隔符。
本文介绍使用java正则表达式精准提取pdf或文本中紧随“account”和“routing”关键词之后的数字,并将其封装为`map
在处理银行凭证、PDF解析结果或OCR输出等非结构化文本时,常需从自由格式内容中定位关键字段(如账户号、路由号),并提取其后紧跟的数值。直接用简单关键词匹配(如"account")无法获取对应数字;而若未考虑标点、空格、换行等干扰,易导致提取失败。为此,推荐采用正向先行断言((?结合动态宽度分隔符的正则策略。
核心思路是:匹配“位于account或routing之后、且中间最多含10个非数字字符(如冒号、空格、制表符、换行符等)”的连续数字串。该设计兼顾常见格式变体,例如:
- Account #: 987654321
- ROUTING:123456789
- account number - 44556677
- Routing Number\n\t1122334455
以下是完整可运行示例:
import java.util.*;
import java.util.regex.*;
public class Bank {
private static final Pattern accountPattern;
private static final Pattern routingPattern;
static {
// 匹配紧跟在 "account" 后(允许0~10个非数字字符)的数字序列
accountPattern = Pattern.compile("(? accountInfo = extractAccountInfo(pdfText);
System.out.println(accountInfo); // {account=12345, routing=1122334455}
}
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()) {
result.put("account", Long.parseLong(accountMatcher.group(1)));
}
if (routingMatcher.find()) {
result.put("routing", Long.parseLong(routingMatcher.group(1)));
}
// 可选:增强健壮性——若任一字段缺失,抛出明确异常
if (!result.containsKey("account") || !result.containsKey("routing")) {
throw new IllegalArgumentException(
"Failed to extract both 'account' and 'routing' numbers from text."
);
}
return result;
}
}</string></string>
✅ 关键优化说明:
- 使用 group(1) 显式捕获数字部分(避免group()返回整个匹配上下文);
- 将 if (aMatcher.find() && rMatcher.find()) 改为独立判断,防止因匹配顺序导致漏提(例如某文档中routing出现在account之前);
- 正则中 \D{0,10} 比硬编码空格/冒号更鲁棒,兼容各类分隔符;
- Long 类型适配典型银行号码长度(通常≤12位),如需超长支持,可改用 BigInteger 或 String。
⚠️ 注意事项:
- 若文本中存在多个匹配项,默认返回首次出现的结果;如需全部匹配,请改用循环调用 matcher.find() 并逐个 put;
- 确保输入文本已做基础清洗(如去除多余控制字符),避免影响 \D 判定;
- 在高并发场景下,Pattern.compile() 应复用静态实例(本例已实现),避免重复编译开销。
通过此方法,您可稳定、高效地将非结构化文本中的银行标识字段转化为结构化键值对,为后续校验、存储或API集成提供可靠数据基础。










