0

给定以下字符串:

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 个单词。关于为什么的任何想法?提前致谢。

4

4 回答 4

5

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

text.split("\\s+")
于 2013-03-03T23:11:21.650 回答
0

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

于 2013-03-03T23:16:44.130 回答
0

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

text.split("\\s+")

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

于 2013-03-03T23:17:25.130 回答
0

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

    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参数。

于 2013-03-03T23:45:11.460 回答