dog*_*ane 23
Guava的CharMatcher API非常强大和简洁:
CharMatcher.is('a').countIn("aaaab"); //returns 4
Run Code Online (Sandbox Code Playgroud)
小智 22
String string = "aaab";
int count = string.length() - string.replaceAll("a", "").length();
Run Code Online (Sandbox Code Playgroud)
而不是"a"使用像"[a-zA-Z]"这样的正则表达式来计算所有单词字符
Mik*_*e G 15
尝试使用Apache Commons的StringUtils:
int count = StringUtils.countMatches("aaaab", "a");
// count = 4
Run Code Online (Sandbox Code Playgroud)
jjn*_*guy 13
如果不使用正则表达式,代码看起来更容易阅读.
int count = 0;
for(int i =0; i < string.length(); i++)
if(string.charAt(i) == 'a')
count++;
Run Code Online (Sandbox Code Playgroud)
count现在包含字符串中'a'的数量.并且,这在最佳时间执行.
正则表达式很适合模式匹配.但只是一个常规循环将在这里完成工作.
正则表达式并不是特别擅长计算简单的事情。想想蚂蚁+大锤。他们擅长将复杂的字符串分解成碎片。
无论如何,这是 OP 感兴趣的一种解决方案 - 使用正则表达式来计算“a”:
public class Reggie {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[^a]*a");
Matcher matcher = pattern.matcher("aaabbbaaabbabababaaabbbbba");
int count = 0;
while(matcher.find()) {
count++;
}
System.out.println(count+" matches");
}
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,这是一种非常缓慢的方法。更糟糕的是,它不是最简单的,当然也不是最有可能没有错误的。尽管如此,如果您想要比 'a' 更复杂的东西,那么随着请求的字符串变得更复杂,正则表达式将变得更合适。例如,如果您想从一个长字符串中提取美元金额,那么正则表达式可能是最好的答案。
现在,关于正则表达式: [^a]*a
这[^a]*意味着“匹配零个或多个非“a”字符。这允许我们从字符串的开头吞噬非 'a' 的 crud:如果输入是 'bbba' 那么[^a]*将匹配 'bbb'。它与“a”不匹配。不用担心,正则表达式中尾随的 'a' 表示“完全匹配一个 'a'”。所以我们的正则表达式说,“匹配零个或多个非 'a' 字符,后跟一个 'a'。”
好的。现在您可以阅读有关模式和匹配器的信息。简而言之,Pattern 是一个编译后的正则表达式。编译正则表达式的成本很高,所以我将我的正则表达式设为静态,这样它们只会被编译一次。Matcher 是一个将字符串应用于 Pattern 以查看它是否匹配的类。Matcher 具有状态信息,使其可以重复应用 Pattern 沿着字符串爬行。
循环基本上是说,“匹配器,爬下字符串找到模式的下一次出现。如果我们找到它,增加计数器。” 请注意,Matcher 找到的字符序列不仅仅是“a”。它正在查找如下序列:'a'、'bbba'、'bba'、'ba' 等。也就是说,除了最后一个字符外不包含 'a' 的字符串。