2013-03-03 35 views
0

考虑以下字符串:为什么我的角色和单词会被忽略?

字符串文本= “树林是\ nlovely,\ t \ tdark和深”;

我希望所有的空格都作为单个字符来处理。例如,\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个单词。任何想法为什么?提前致谢。

+0

打印出您在第一个循环中找到的每个非空白字符,以及拆分数组的所有元素 - 它应该非常明显。如果不是,请用你发现的内容编辑你的问题,我们可以帮助你。 – Floris 2013-03-03 23:12:40

回答

5

您在单个空白处匹配。相反,你可以匹配一个或多个

text.split("\\s+") 
+0

感谢@Reimeus(+1) - 解决了字数问题 - 字符数呢?再次感谢! – IAmYourFaja 2013-03-03 23:12:42

+0

@DirtyMikeAndTheBoys对于一个肮脏的解决方案,你可以使用'text.replaceAll(“\\ s +”,“”).length' - 将一个或多个空白匹配全部替换为一个,并打印它的长度。 – ddmps 2013-03-03 23:14:27

+0

@DirtyMikeAndTheBoys,是的,正如Pesci所建议的那样,我认为可能使用'text.replaceAll(“\\ s +”,“”).length()'可能是最好的选择。在这种情况下使用'Character'方法会更麻烦:) – Reimeus 2013-03-03 23:49:46

0

您在第一循环只计算非空白字符 - 所以不计算空间等等都没有。那么30是正确的答案。至于第二个 - 我怀疑分裂将连续的空白处理为不同的,所以在两个标签之间有一个“空”字。

0

Reimueus已经解决您的字数问题:

text.split("\\s+") 

和你的字符数是corret。换行符\n和制表符\t被认为是空白。如果你不想要它们,你可以实现你自己的isWhitespace函数。

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);  

字符计数是通过更换所有空格组为单个空格和只是把所得到的字符串的长度来实现;

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