使用 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());
我已经实现了使用正则表达式从字符串中提取一些值的逻辑。
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());