2013-09-16 171 views
41

我正在嘗試使用Java中的用戶輸入來獲取一個句子,並且我需要使其成爲小寫字母並刪除所有標點符號。這是我的代碼:如何從Java輸入文本中刪除標點符號?

String[] words = instring.split("\\s+"); 
    for (int i = 0; i < words.length; i++) { 
     words[i] = words[i].toLowerCase(); 
    } 
    String[] wordsout = new String[50]; 
    Arrays.fill(wordsout,""); 
    int e = 0; 
    for (int i = 0; i < words.length; i++) { 
     if (words[i] != "") { 
      wordsout[e] = words[e]; 
      wordsout[e] = wordsout[e].replaceAll(" ", ""); 
      e++; 
     } 
    } 
    return wordsout; 

我似乎無法找到任何方法來刪除所有非字母字符。我曾嘗試使用正則表達式和迭代器,但沒有運氣。謝謝你的幫助。

回答

75

這首先刪除所有非字母字符,摺疊爲小寫,然後將輸入,做所有的工作在單行:

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+"); 

空間最初留在輸入這樣的分裂依然會工作。

通過刪除之前的垃圾字符,可以避免必須遍歷元素。

+32

如果目標是去除標點符號,那麼'replaceAll(「\\ p {P}」,「」)'更有意義嗎? – VGR

+0

@VGR基於標題是的,但OP澄清問題*刪除所有非字母字符* – Bohemian

+1

是「å」一個字母嗎?由於該角色將被刪除。 –

2

你可以試試這個: -

Scanner scan = new Scanner(System.in); 
System.out.println("Type a sentence and press enter."); 
String input = scan.nextLine(); 
String strippedInput = input.replaceAll("\\W", ""); 
System.out.println("Your string: " + strippedInput); 

​​非單詞字符匹配,因此,上述正則表達式匹配,並刪除所有非單詞字符。

+0

這不會取代位數。我猜根據非信件來的。 –

+1

@RohitJain: - 是的,我明白你的觀點。但我認爲我們經常在語言中使用的標點符號。我採取了標點符號的字面意思! –

+0

不是你的錯。 OP問題不清楚。 –

3

如果你不想使用正則表達式(給你的問題,這似乎非常不必要的),也許你應該嘗試是這樣的:在String,只追加

public String modified(final String input){ 
    final StringBuilder builder = new StringBuilder(); 
    for(final char c : input.toCharArray()) 
     if(Character.isLetterOrDigit(c)) 
      builder.append(Character.isLowerCase(c) ? c : Character.toLowerCase(c)); 
    return builder.toString(); 
} 

它通過循環的根本char[]char如果它是一個字母或數字(過濾出所有符號,我假設你正在嘗試完成),然後附加小寫版本的char

+7

沒有人通過學習正則表達式節省時間 – slater

0

我不喜歡使用正則表達式,所以這裏是另一個簡單的解決方案。

public String removePunctuations(String s) { 
    String res = ""; 
    for (Character c : s.toCharArray()) { 
     if(Character.isLetterOrDigit(c)) 
      res += c; 
    } 
    return res; 
} 

注:這將包括字母和數字