我正在尝试使用基于 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 来做到这一点?
最佳答案
要正确使用 Pattern::splitAsStream
,您必须反转正则表达式。这意味着您应该使用 \\D+
,而不是使用 \\d+
(它会拆分每个数字)。这会为您提供字符串中的数字。
final Pattern pattern = Pattern.compile("\\D+");
// count is 4
long count = pattern.splitAsStream("1,2,3,4").count();
// count is 1
count = pattern.splitAsStream("1").count();
关于java - 计算与流的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531526/