查找Java字符串中出现的字符

Ste*_*ris 20 java regex

我想计算字符串中字符的出现次数,假设我有字符串"aaaab",我如何计算其中的数量?

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)

  • +1 简洁易读 (2认同)

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'的数量.并且,这在最佳时间执行.

正则表达式很适合模式匹配.但只是一个常规循环将在这里完成工作.


Ton*_*nis 5

正则表达式并不是特别擅长计算简单的事情。想想蚂蚁+大锤。他们擅长将复杂的字符串分解成碎片。

无论如何,这是 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' 的字符串。