一个用于计算匹配项的线性函数

zqry0prt  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(267)

有没有一个衬垫来代替while环?

String formatSpecifier = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
Pattern pattern = Pattern.compile(formatSpecifier);
Matcher matcher = pattern.matcher("hello %s my name is %s");

// CAN BELOW BE REPLACED WITH A ONE LINER?
int counter = 0;
while (matcher.find()) {
    counter++;
}
8ehkhllq

8ehkhllq1#

就我个人而言,考虑到原始代码已经很容易理解,我不认为有任何理由将目标放在一个行程序上。不管怎样,如果你坚持的话,有几种方法:

1. 生成助手方法

做这样的东西

static int countMatches(Matcher matcher) {
  int counter = 0;
  while (matcher.find())
    counter++;
  return counter;
}

所以你的代码

int counter = countMatches(matcher);

2. java 9 Matcher 在Java9中提供 results() 返回一个 Stream<MatchResult> . 所以你的代码变成

int counter = matcher.results().count();

3. 字符串替换

类似于另一个答案所暗示的。
这里我将替换为空字符(在任何普通字符串中几乎不使用空字符),并通过拆分进行计数:
您的代码变成:

int counter = matcher.replaceAll("\0").split("\0", -1).length - 1;
sigwle7e

sigwle7e2#

是:用既不在模式中也不在要匹配的字符串中的字符替换任何出现的字符,然后计算此字符出现的次数。这里我选择x,作为简单的例子。您应该使用一个不常用的字符(例如,请参阅utf-8特殊字符)。

final int counter = pattern.matcher("hello %s my name is %s").replaceAll("X").replaceAll("[^X]", "").length();

在您的示例中,计数器的计算值是2。

相关问题