2012-04-24 10 views
1

自分のプログラムのインデックスを作成したいと考えています。最も重要なステップの1つは、テキストを正規化することです。例: 私は空白、句読点([])と特殊文字(@)をフィルタリングする "macproapple"に "[(Mac Pro @apple)]"を変換する必要があります。私のコードは次のようなものです: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

+0

であるが、StringBufferのは」doesnのt replaceIllメソッドを持っています – remy

答えて

2

あなたがメモリ内に作成された複数のオブジェクトに心配する必要はありませんので、

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

内部replaceAll方法はStringBufferのを使用して、正規表現でreplaceAll APIを使用することができます。ここで

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

ありがとう、今私は文字列の置換方法を使用することにしました。 – remy

+0

文字列オブジェクトの割り当てが心配な場合は、正規表現をプリコンパイルする必要があります。 –

1

てみthis-

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]", "")が(で示されていない文字列内のすべてを削除しIS-ために小さな説明の出力を提供します^)をAZとazで使用します。 Javaの正規表現はhereと説明されています。

最後に文字列を小文字に変換する場合は、s.toLowerCase()を使用する必要があります。

+0

ありがとう、私はStringBufferを使用するためのソリューションを見つけることができない場合、私はStringを使用すると思います – remy

+3

あなたは間違っています。 Javaでは、Stringオブジェクトは不変です。 String(たとえばreplaceAll()など)を変更するたびに、新しいStringオブジェクトが作成されます。 – j0ntech

+0

私の答えを編集しました。それを実現しませんでした。 – sgowd

関連する問題