是否有一个衬垫来替换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++;
}
答案 0 :(得分:2)
鉴于原始代码已经很容易理解,我个人认为没有理由瞄准单线。无论如何,如果你坚持,有几种方法:
制作这样的东西
static int countMatches(Matcher matcher) {
int counter = 0;
while (matcher.find())
counter++;
return counter;
}
所以你的代码变成了
int counter = countMatches(matcher);
Matcher
提供results()
,返回Stream<MatchResult>
。所以你的代码变成了
int counter = matcher.results().count();
与其他答案的建议相似。
这里我用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。