为什么我的角色和字数很重要?

时间:2013-03-03 23:09:02

标签: java regex string text word-count

给出以下字符串:

  

字符串文字=“树林是\ nlovely,\ 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 个答案:

答案 0 :(得分:5)

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

text.split("\\s+")

答案 1 :(得分:0)

您只计算第一个循环中的非空白字符 - 所以根本不计算空间等。然后30是正确的答案。至于第二个 - 我怀疑分裂是将连续的空格视为不同,所以两个标签之间有一个“空”字。

答案 2 :(得分:0)

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

text.split("\\s+")

你的角色数是正确的。换行符\n和制表符\t被视为空格。如果您不希望它们出现,您可以实现自己的isWhitespace功能。

答案 3 :(得分: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 参数。