使用 java 流的模式匹配

Pattern matching using java streams

我已经实现了使用正则表达式从字符串中提取一些值的逻辑。

for(int i = 0; i < fragmentedHeader.length - 1; i++) {
    if(fragmentedHeader[i + 1].contains("ads_management")) {
        Pattern pattern = Pattern.compile("[0-9]{15}");
        Matcher matcher = pattern.matcher(fragmentedHeader[i]);
        while (matcher.find()) {
            catalogIds.add(matcher.group());
        }
    }
}

它按预期工作。我现在必须使用 java 流来实现此逻辑以使其更 readable.I 只是想让它更具可读性和易读性。我已经使用它实现了,但它没有任何建议。

Pattern pattern = Pattern.compile("[0-9]{15}");
catalogIds = IntStream.range(0, fragmentedHeader.length - 1)
    .filter(index -> fragmentedHeader[index+1].contains("ads_management") && pattern.matcher(fragmentedHeader[index]).find())
    .mapToObj(index -> fragmentedHeader[index])
    .collect(Collectors.toList());

catalogIds = catalogIds.stream()
    .map(header -> pattern.matcher(header).group())
    .collect(Collectors.toList());

我收到的错误是找不到匹配项。但是有没有办法为下一个流提供匹配器

.filter(index -> fragmentedHeader[index+1].contains("ads_management") && pattern.matcher(fragmentedHeader[index]).find())
.mapToObj(index-> pattern.matcher(fragmentedHeader[index]).group())

您可以使用方法 Matcher.results() 为与模式匹配的输入序列的每个子序列获取匹配结果流。这也将使您能够一次完成任务,而不是您现在正在执行的中间步骤,例如将子结果存储在列表中。

List<String> catalogIds =
IntStream.range(0, fragmentedHeader.length - 1)
        .filter(index -> fragmentedHeader[index+1].contains("ads_management"))
        .mapToObj(index -> fragmentedHeader[index])
        .flatMap(str -> Pattern.compile("[0-9]{15}").matcher(str).results())
        .map(MatchResult::group)
        .collect(Collectors.toList());