【发布时间】:2016-04-04 13:06:30
【问题描述】:
我正在尝试使用基于 Java 8 lambdas/streams 的简单解决方案来计算正则表达式模式的匹配数。例如对于这个模式/匹配器:
final Pattern pattern = Pattern.compile("\\d+");
final Matcher matcher = pattern.matcher("1,2,3,4");
有splitAsStream 方法可以拆分给定模式上的文本,而不是匹配模式。虽然它很优雅并且保持不变性,但它并不总是正确的:
// count is 4, correct
final long count = pattern.splitAsStream("1,2,3,4").count();
// count is 0, wrong
final long count = pattern.splitAsStream("1").count();
我也尝试(ab)使用IntStream。问题是我必须猜测我应该调用多少次 matcher.find() 而不是直到它返回 false。
final long count = IntStream
.iterate(0, i -> matcher.find() ? 1 : 0)
.limit(100)
.sum();
我熟悉传统的解决方案while (matcher.find()) count++;,其中count 是可变的。有没有使用 Java 8 lambdas/streams 的简单方法?
【问题讨论】:
-
试试看
takeWhile:stackoverflow.com/a/20765715/1743880 -
分割 != 匹配。这就是为什么你得到奇数。你应该否定你的 Pattern 以检索数字并得到你想要的。
-
@Tunaki
takeWhile看起来很有趣。但它显然会在 Java 9 中可用,而不是在 Java 8 中。 -
@Flown 我知道
splitAsStream做了什么以及为什么它不像我使用它那样工作。我刚刚尝试了您的建议来否定该模式,我很惊讶地看到"1,2,3,4"和"1"的正确结果。您要发布答案吗? -
在 Java-9 中:
matcher.results().count();
标签: java regex java-8 java-stream