【问题标题】:How to count occurrence of each character in java string using Pattern Class(Regex)如何使用模式类(正则表达式)计算java字符串中每个字符的出现次数
【发布时间】:2018-12-03 05:19:22
【问题描述】:

我正在尝试查找给定字符串上每个字符的出现次数。

  • 预期输出:t=2 e=1 s=1 i=1 n=1 g=1
  • 电流输出:T=0 e=0 s=0 t=0 i=0 n=0 g=0

代码:

String str = "Testing";
int count = 0;

Pattern p = Pattern.compile("[a-zA-Z]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);

while (m.find()) {
    if (m.group().equals(str)) {
        count++;
    }
    System.out.println(m.group() + "=" + count);
}

有很多方法可以做到这一点,但我只在寻找正则表达式,那么我们如何通过使用正则表达式来实现这一点。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

    标签: java regex string while-loop pattern-matching


    【解决方案1】:

    不需要正则表达式来解决您的问题,如果您使用的是 Java8+,您可以使用:

    String input = "Testing";
    Map<String, Long> result = Arrays.stream(input.split(""))
            .map(String::toLowerCase)
            .collect(Collectors.groupingBy(s -> s, LinkedHashMap::new, Collectors.counting()));
    

    输出

    {t=2, e=1, s=1, i=1, n=1, g=1}
    

    编辑

    嗯,在这种情况下,Pattern 没用,我不建议在这个问题中使用它,作为使用 Pattern 的替代解决方案,您可以使用 Java9+ 的结果:

    String str = "Testing";
    Pattern.compile(".").matcher(str)
            .results()
            .map(m -> m.group().toLowerCase())
            .collect(Collectors.groupingBy(s -> s, LinkedHashMap::new, Collectors.counting()))
            .forEach((k, v) -> System.out.println(k + " = " + v)); 
    

    输出

    t = 2
    e = 1
    s = 1
    i = 1
    n = 1
    g = 1
    

    【讨论】:

    • 感谢您的评论,但以上部分我知道我们可以使用 Map 来实现,但我们也可以使用 Pattern 类来实现吗???
    • @Ab123 Pattern 在这里没用,我不认为正则表达式是用来查找每个字符的出现次数的,请问你为什么要在这个问题中使用 Pattern?
    • OP 表示如果字符串中包含任何特殊字符(testing1),则不应包含。
    • 你是什么意思@Nikolas 你是说他只想要大小写字母吗?
    • @Ab123:请将对您最有帮助的答案之一标记为已接受 - 它会告诉社区该问题已经找到答案,并帮助其他有类似问题的用户接受回答。
    【解决方案2】:

    实现结果的方法有很多种,但 Regex 不是这方面的工具。如果您想过滤字符并确保只计算[a-zA-Z],请使用string = string.replaceAll("[^a-zA-Z]", ""); 过滤不需要的字符。现在回到你的问题。

    您需要将String 拆分为字符,Map&lt;Character, Integer&gt; 您将存储这些字符及其出现次数。我建议你使用LinkedHashMap&lt;Character, Integer&gt; 来保证插入的顺序。

    char[] charArray = string.toCharArray();
    Map<Character, Integer> map = new LinkedHashMap<>();
    

    现在循环遍历字符并将它们保存到地图中。如果已经存储了一个字符,则将该值加一。这可以通过程序化和传统的for-loop 来实现,或者从Java 8 开始,您可以使用

    在 Java 8 之前:

    for (char ch: charArray) {
        if(map.containsKey(ch)){
            map.put(ch, map.get(ch)+1);
        } else {
            map.put(ch, 1);
        }
    }
    

    Java 8 之后(string.split("") 返回一个字符串数组,需要将它们映射到字符):

    Map<Character, Long> map = Arrays
        .asList(string.split("")).stream().map(s -> s.charAt(0))
        .collect(Collectors.groupingBy(s -> s, LinkedHashMap::new, Collectors.counting()));
    

    两种情况下的输出都是一样的:

    System.out.println(map); // prints {t=2, e=1, s=1, i=1, n=1, g=1}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2014-11-06
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多