Java Regex NPE On Matcher.Find()



我快疯了,试图弄清楚为什么这不起作用。

我有一个更改日志文件,我想在其中使用内容并解析版本号。我有一个现有的正则表达式,我已将其用作新正则表达式的基线,以仅去除版本号,并可以看到它有效。但是,当我尝试使用 .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"+
"nn"+
"- None"+
"nn"+
"## 5.18.72 (2020-01-17)"+
"nn"+
"- #### [US12345]"+
"nn"+
"## 5.18.71 (2020-01-15)"+
"nn"+
"- #### [US123456]"+
"nn"+
"## 5.18.70 (2020-01-09)";
private static final String RAW_CHANGELOG_PATTERN = "(?ms)(##[\w\s\-]*.%s.*nn.*)(nn##[\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("Nextn");
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工作并产生我期望的输出(两个版本号之间的所有内容(,但使用新正则表达式RAW_CHANGELOG_VERSION_PATTERN的第二种方法extractVersions抛出 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]

最新更新