java - 计算与流的正则表达式匹配

标签 java regex java-8 java-stream

我正在尝试使用基于 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/

相关文章:

python - 跳过从正则表达式中的字符开始

ruby 正则表达式在字符串中查找前两个数字

用于数学运算的 PHP 正则表达式

java - 什么时候应该在 Java 8 中使用 Supplier?

java-8 - Findbugs 3.0.0 FINAL 什么时候发布?

java - OpenCms 10 内容存储在数据库中

java - 我们如何在 weblogic 服务器中获取历史线程转储

java - 为什么我得到这个线性布局的空值

java - 非空参数的方法引用?

java - 为什么程序中的String置换swap了两次?