Java正则表达式如何跳过空行,避免匹配时出现Null错误?
问题解决办法
核心问题
- 你直接调用
matcher.group()但未先检查find()是否成功——只要遇到没匹配到T20/SPE内容的行(比如空行、Migratio这类行),就会抛出异常,直接中断后续逻辑。 - 原正则表达式冗余,
^T20.*|^SPE.*|T20.*|SPE.*重复了匹配规则,且没有针对性处理空行和票据号的精准匹配。
修正步骤
1. 优化正则表达式
如果目标是提取行内的T20-XXX或SPE-XXX格式票据号,用这个精准匹配的正则即可:
Pattern pattern = Pattern.compile("(T20-\\d+|SPE-\\d+)");
要是需要严格匹配行首的T20/SPE内容,结合多行模式:
Pattern pattern = Pattern.compile("^(T20.*|SPE.*)", Pattern.MULTILINE);
2. 修复代码逻辑(关键)
必须先确认匹配成功,再提取结果,同时直接跳过空行:
// 假设你是逐行读取文件内容,遍历每一行 for (String line : fileLines) { // 跳过空行或仅含空白字符的行 if (line.trim().isEmpty()) { continue; } Matcher matcher = pattern.matcher(line); String res = ""; if (matcher.find()) { // 用group(1)直接提取票据号(对应正则里的分组) res = matcher.group(1); } // 处理业务逻辑 for(Buchungen b : buchungsListe) { // 建议用contains而非equals,原行包含其他内容,equals会匹配失败 if(b.TOOLS_Kommentar.contains(res) && !res.isEmpty()) { b.TOOLS_JiraTicket = res; } else { b.TOOLS_JiraTicket = ""; } } }
3. 针对你原代码的快速修改
如果buchung.TOOLS_Kommentar是包含多行的字符串,可这样调整:
Pattern pattern = Pattern.compile("(T20-\\d+|SPE-\\d+)", Pattern.DOTALL); Matcher matcher = pattern.matcher(buchung.TOOLS_Kommentar); String res = ""; // 默认空值,避免Null问题 if (matcher.find()) { res = matcher.group(1); } for(Buchungen b : buchungsListe) { if(b.TOOLS_Kommentar.contains(res) && !res.isEmpty()) { b.TOOLS_JiraTicket = res; } else { b.TOOLS_JiraTicket = ""; } }
补充说明
Pattern.MULTILINE:让正则中的^匹配每一行的开头,而非整个字符串的开头。Pattern.DOTALL:让正则中的.可以匹配换行符,支持处理多行文本。- 用
line.trim().isEmpty()跳过空行,比正则过滤更高效。
内容的提问来源于stack exchange,提问作者Eas
相关产品推荐
相关产品推荐

