2013-03-03 63 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參數。