Matcher.Find() 上的 Java 正则表达式 NPE

标签 java regex nullpointerexception matcher

我要疯狂地试图找出为什么这不起作用。

我有一个变更日志文件,我想在其中使用内容并解析版本号。我有一个可用的现有正则表达式,我已将其用作新正则表达式的基线,以仅删除版本号并可以看到它是否有效。但是,当我尝试使用 .find() 方法迭代新的 Matcher 结果以获取版本号时,我收到空指针异常,并且找不到任何结果。

正则表达式、编译方式或其他问题是否存在问题?

FWIW,当我在一些在线正则表达式编辑器(基于 Java)上尝试时,正则表达式模式正是我想要的。

这就是我正在运行的内容。

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

    public static final String changelog="## Current Version"+
            "\n\n"+
            "- None"+
            "\n\n"+
            "## 5.18.72 (2020-01-17)"+
            "\n\n"+
            "- #### [US12345]"+
            "\n\n"+
            "## 5.18.71 (2020-01-15)"+
            "\n\n"+
            "- #### [US123456]"+
            "\n\n"+
            "## 5.18.70 (2020-01-09)";

    private static final String RAW_CHANGELOG_PATTERN = "(?ms)(##[\\w\\s\\-]*.%s.*\n\n.*)(\n\n##[\\w\\s\\-]*.%s)";
    private static final String RAW_CHANGELOG_VERSION_PATTERN="(?ms)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})";

     public static void main(String []args){


        System.out.println(extractKnownVersions(changelog));

        System.out.println("Next\n");

        System.out.println(extractVersions(changelog.toString()));
     }

    private static String extractKnownVersions(String changelog){
        String patternString = String.format(RAW_CHANGELOG_PATTERN,"5.18.72","5.18.70");
        Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(changelog);
        String result = null;
        if (matcher.find()) {
            result = matcher.group();
        } else {
            System.out.println("No diff found between versions 5.18.72 and 5.18.70 Check that both versions exist in Changelog.");
        }
        return result;
    }

    private static List<String> extractVersions(String changelog) {
        // TODO: Fix the regex so that it actually grabs what we want
        String patternString = RAW_CHANGELOG_VERSION_PATTERN;
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(changelog);

        List<String> result = null;
        int count = 0;

        try {
            while (matcher.find()) {
                result.add(matcher.group());
                System.out.println("result: " + result.get(count));
                count++;
            }
        } catch (NullPointerException npe) {
            System.out.println("NPE: Could not extract versions from Changelog");
        } catch (Exception e) {
            System.out.println("Exception extracting versions from Changelog");
        }

        System.out.println("match count:" + count);
        return result;
    }
}

这是 SOP 的输出 - 请注意原始正则表达式 RAW_CHANGELOG_PATTERN 可以工作并生成我期望的输出(两个版本号之间的所有内容),但使用新正则表达式 extractVersions 的第二种方法 RAW_CHANGELOG_VERSION_PATTERN 会抛出 NPE。

## 5.18.72 (2020-01-17)

- #### [US12345]

## 5.18.71 (2020-01-15)

- #### [US123456]

## 5.18.70
Next

NPE: Could not extract versions from Changelog
match count:0
null

我希望这是我错过的一些愚蠢的语法?

最佳答案

您的 NPE 来自未初始化列表:

List<String> result = null;

更改为

List<String> result = new ArrayList<>();

result: 5.18.72
result: 5.18.71
result: 5.18.70
match count:3
[5.18.72, 5.18.71, 5.18.70]

关于Matcher.Find() 上的 Java 正则表达式 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59969547/

相关文章:

javascript - 用 jQuery 替换正斜杠

c++ - std::regex_replace 不接受少于 6 个参数

java - catch block 中的空指针

android - LocationManager初始化后为null

java - Fragment Recycler View onclick 显示弹出窗口

java - Glassfish 2.1.1 - session Bean 重复调用 init() 和 destroy()

Javascript 从引用者中解析 id

java - 为什么我的输入中出现 NullPointerException?

java - java的一个函数可以在不同条件下返回两种类型吗?

java - 在 Java 中使用 directinput 发送 key ?