Spring Batch中如何实现PatternMatchingCompositeLineTokenizer大小写不敏感匹配?
Spring Batch实现PatternMatchingCompositeLineTokenizer大小写不敏感匹配
针对定长文件记录的大小写不敏感匹配需求,有两种实用的实现方式:
方法一:自定义大小写不敏感的PatternMatcher(推荐)
PatternMatchingCompositeLineTokenizer默认使用的SimplePatternMatcher是大小写敏感的,你可以通过实现PatternMatcher接口,自定义一个支持忽略大小写的匹配器:
import org.springframework.batch.item.file.transform.PatternMatcher; import org.springframework.batch.item.file.transform.SimplePatternMatcher; public class CaseInsensitivePatternMatcher implements PatternMatcher { @Override public boolean matches(String pattern, String input) { // 将模式和输入统一转为小写后执行匹配 String lowerPattern = pattern.toLowerCase(); String lowerInput = input.toLowerCase(); // 复用原生SimplePatternMatcher的通配符匹配逻辑 return new SimplePatternMatcher().matches(lowerPattern, lowerInput); } }
然后在配置PatternMatchingCompositeLineTokenizer时,替换默认的匹配器即可:
PatternMatchingCompositeLineTokenizer tokenizer = new PatternMatchingCompositeLineTokenizer(); HashMap<String, LineTokenizer> matchers = new HashMap<>(); matchers.put("ABC*", abcRecordTokenizer()); matchers.put("wxyz*", wxyzRecoredTokenizer()); tokenizer.setTokenizers(matchers); // 设置自定义的大小写不敏感匹配器 tokenizer.setPatternMatcher(new CaseInsensitivePatternMatcher());
这种方式仅在匹配阶段忽略大小写,不会修改原行数据,完全兼容原有LineTokenizer的业务逻辑。
方法二:统一归一化输入行大小写(简易场景)
如果你的业务场景允许修改输入行的大小写,可以在将行交给tokenizer之前,统一转换为大写(或小写),同时将匹配模式也改为对应格式:
// 读取到原始行后先归一化大小写 String normalizedLine = originalLine.toUpperCase(); // 匹配模式统一使用大写(比如原"wxyz*"改为"WXYZ*") HashMap<String, LineTokenizer> matchers = new HashMap<>(); matchers.put("ABC*", abcRecordTokenizer()); matchers.put("WXYZ*", wxyzRecoredTokenizer()); PatternMatchingCompositeLineTokenizer tokenizer = new PatternMatchingCompositeLineTokenizer(); tokenizer.setTokenizers(matchers); // 用归一化后的行执行匹配和解析 FieldSet fieldSet = tokenizer.tokenize(normalizedLine);
注意:这种方式会改变LineTokenizer处理的行内容,若业务需要保留原始数据的大小写,不建议使用。
内容的提问来源于stack exchange,提问作者Sumit Sood
相关产品推荐
相关产品推荐

