2012-04-24 22 views
1

我想爲我的程序構建索引,其中最重要的一步是對文本進行規範化。 例如我需要將「[(Mac Pro @apple)]」轉換爲「macproapple」,其中我過濾空格,標點([()])和特殊字符(@)。我的代碼是這樣的:java:如何正常化文本?

StringBuilder sb = new StringBuilder(text); 
sb = filterPunctuations(sb); 
sb = filterSpecialChars(sb); 
sb = filterBlankSpace(sb); 
sb = toLower(sb); 

因爲這會產生很多String對象,我決定使用StringBuilder。但我不知道如何用StringBuffer來完成它。有沒有人有一些建議?我也需要處理漢字。

+0

http://stackoverflow.com/questions/1805518/replacing-all-non-alphanumeric-characters-with-empty-strings – sgowd 2012-04-24 05:50:05

+0

但StringBuffer的沒有按」 t有replaceAll方法 – remy 2012-04-24 05:53:49

回答

2

您可以使用replaceAll API使用正則表達式

String originalText = "[(Mac Pro @apple)]"; 
String removedString = originalText.replaceAll("[^\\p{L}\\p{N}]", "").toLowerCase(); 

內部replaceAll方法使用StringBuffer的,你不用在內存中創建多個對象擔心。

這裏是replaceAll代碼Matcher

public String replaceAll(String replacement) { 
     reset(); 
     boolean result = find(); 
     if (result) { 
      StringBuffer sb = new StringBuffer(); 
      do { 
       appendReplacement(sb, replacement); 
       result = find(); 
      } while (result); 
      appendTail(sb); 
      return sb.toString(); 
     } 
     return text.toString(); 
    } 
+0

謝謝,現在我決定使用字符串replaceall方法。 – remy 2012-04-24 06:14:00

+0

如果字符串對象分配令您擔心,那麼您應該預編譯正則表達式! – 2012-04-24 06:58:58

1

嘗試這 -

class Solution 
{ 
     public static void main (String[] args) 
     { 
       String s = "[(Mac Pro @apple)]"; 
       s = s.replaceAll("[^A-Za-z]", ""); 
       System.out.println(s); 
     } 
} 

這給出了

MacProapple 

小解釋上面的行是 -

s.replaceAll("[^A-Za-z]", "")刪除字符串中一切未(由表示的輸出^)在AZ和az。 Java中的正則表達式解釋爲here

如果要在最後將字符串轉換爲小寫字母,則需要使用s.toLowerCase()

+0

謝謝,我想我會使用字符串,如果我找不到使用StringBuffer的解決方案 – remy 2012-04-24 06:02:46

+3

你錯了。在Java中,一個String對象是不可變的。每次更改一個字符串(例如replaceAll())時,都會創建一個新的String對象。 – j0ntech 2012-04-24 06:03:38

+0

編輯我的答案。沒有意識到這一點。 – sgowd 2012-04-24 06:04:52