计数正则表达式与流匹配

Man*_*dis 7 java regex java-8 java-stream

我试图用简单的Java 8 lambdas/stream解决方案来计算正则表达式模式的匹配数.例如,对于此模式/匹配器:

final Pattern pattern = Pattern.compile("\\d+");
final Matcher matcher = pattern.matcher("1,2,3,4");
Run Code Online (Sandbox Code Playgroud)

有一种方法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();
Run Code Online (Sandbox Code Playgroud)

我也试过(ab)使用IntStream.问题是我必须猜测应该调用多少次matcher.find()而不是直到它返回false.

final long count = IntStream
        .iterate(0, i -> matcher.find() ? 1 : 0)
        .limit(100)
        .sum();
Run Code Online (Sandbox Code Playgroud)

我所熟悉的传统的解决方案while (matcher.find()) count++;,其中count是可变的.使用Java 8 lambdas/streams有一种简单的方法吗?

Flo*_*own 4

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();
Run Code Online (Sandbox Code Playgroud)

  • Java 9 有直接的解决方案 `Pattern.compile("\\d+").matcher("1,2,3,4").results().count()`... (5认同)