【问题标题】:Why are my character and word counts off?为什么我的字数和字数被取消了?
【发布时间】:2013-02-17 23:31:28
【问题描述】:

给定以下字符串:

String text = "树林\n可爱,\t\t又黑又深。";

我希望所有空格都被视为单个字符。例如,\n 是 1 个字符。 \t\t 也应该是 1 个字符。按照这个逻辑,我数了 36 个字符和 7 个单词。但是当我通过以下代码运行它时:

String text = "The woods are\nlovely,\t\tdark and deep.";

int numNewCharacters = 0;
for(int i=0; i < text.length(); i++)
    if(!Character.isWhitespace(text.charAt(i)))
        numNewCharacters++;

int numNewWords = text.split("\\s").length;

// Prints "30"
System.out.println("Chars:" + numNewCharacters);

// Prints "8"
System.out.println("Words:" + numNewWords);

它告诉我有 30 个字符和 8 个单词。关于为什么的任何想法?提前致谢。

【问题讨论】:

  • 打印出你在第一个循环中找到的每个非空白字符,以及拆分数组的所有元素——那时应该很明显了。如果不是,请使用您找到的内容编辑您的问题,我们可以为您提供帮助。

标签: java regex string text word-count


【解决方案1】:

您正在匹配单个空格。相反,您可以匹配一个或多个

text.split("\\s+")

【讨论】:

  • 感谢@Reimeus (+1) - 解决了字数问题 - 字符数呢?再次感谢!
  • @DirtyMikeAndTheBoys 对于肮脏的解决方案,您可以使用text.replaceAll("\\s+"," ").length - 它将一个或多个匹配的所有空格替换为一个,并打印它的长度。
  • @DirtyMikeAndTheBoys,是的,正如 Pesci 所建议的那样,我认为可能使用 text.replaceAll("\\s+", " ").length() 可能是要走的路。在这种情况下,使用Character 方法会更麻烦:)
【解决方案2】:

您在第一个循环中只计算非空白字符 - 所以根本不计算空格等。那么30是正确答案。至于第二个 - 我怀疑 split 将连续的空白视为不同的,因此两个选项卡之间有一个“空”字。

【讨论】:

    【解决方案3】:

    Reimueus 已经解决了你的字数问题:

    text.split("\\s+")
    

    而且你的字符数是正确的。换行符\n 和制表符\t 被视为空格。如果您不希望它们成为,您可以实现自己的isWhitespace 函数。

    【讨论】:

      【解决方案4】:

      这里是计算单词和字符的完整解决方案:

          System.out.println("Characters: " + text.replaceAll("\\s+", " ").length());
          Matcher m = Pattern.compile("[^\\s]+", Pattern.MULTILINE).matcher(text);
          int wordCount = 0;
          while (m.find()) {
              wordCount ++;
          }
          System.out.println("Words: "+ wordCount);       
      

      字符计数是通过将所有空白组替换为单个空格并仅获取结果字符串的长度来完成的;

      对于字数统计,我们创建了一个匹配任何不包含空格的字符组的模式。您可以在此处使用 \\w+ 模式,但它只会匹配字母数字字符和下划线。另请注意 Pattern.MULTILINE 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多