You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式如何跳过空行,避免匹配时出现Null错误?

问题解决办法

核心问题

  1. 你直接调用matcher.group()但未先检查find()是否成功——只要遇到没匹配到T20/SPE内容的行(比如空行、Migratio这类行),就会抛出异常,直接中断后续逻辑。
  2. 原正则表达式冗余,^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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:51:24