Java正则表达式 - 用于计算匹配的一个班轮

时间:2017-09-05 05:15:54

标签: java regex

是否有一个衬垫来替换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++;
}

2 个答案:

答案 0 :(得分:2)

鉴于原始代码已经很容易理解,我个人认为没有理由瞄准单线。无论如何,如果你坚持,有几种方法:

1。制作帮助方法

制作这样的东西

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

所以你的代码变成了

int counter = countMatches(matcher);

2。 Java 9

Java 9中的

Matcher提供results(),返回Stream<MatchResult>。所以你的代码变成了

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

3。字符串替换

与其他答案的建议相似。

这里我用null字符替换(几乎没有在任何普通字符串中使用),并通过split进行计数:

您的代码变为:

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

答案 1 :(得分:0)

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

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

对于你的例子,计算器的值为2。