2016-03-11 95 views
-1

我有一個包含大量文本的字符串。這裏有一些奇怪的字符,如下所示:█✖✔♫♬▬★從java中刪除非標準字符字符串

這只是我迄今發現的一小部分。我嘗試使用replaceAll方法,但它似乎不工作。是否有一些所有這些類型的角色的集合,或者更好的是,能夠將它們刪除的庫?

+3

您應該指定 - 樣本輸入字符串,期望的輸出字符串和您的代碼。 – TheLostMind

+6

請定義「非標準」的含義。這些對我來說似乎是非常標準的Unicode字符。 – biziclop

+4

「它似乎不起作用」不是問題描述。你試圖做什麼,以及它究竟是如何工作的? – Raedwald

回答

0

如果您只想在您的字符串中使用ASCII字符,則可以遍歷字符串的長度並檢查其中的ASCII值是65-90(AZ)還是97-122(az)或48-57(0- 9)

+3

如果你不確定這個問題,你不應該試着回答它。你應該留下評論(如你所見),要求澄清。 – TheLostMind

2

遍歷字符和檢查每個它是否屬於某種類別定義爲「標準」(此處這樣的類別有:字母,數字,空格,或施加到先前被接受的字符改性劑):

static String standartize(String s) { 
    if (s == null) return null; 
    StringBuilder sb = new StringBuilder(); 
    boolean based = false; // is previous character accepted base for modifier? 
    int c; 
    for (int i = 0; i < s.length(); i += Character.charCount(c)) { 
     c = Character.codePointAt(s, i);    
     if (based && Character.getType(c) == Character.MODIFIER_SYMBOL) { 
      sb.appendCodePoint(c);    
     } else if (Character.isAlphabetic(c) || Character.isDigit(c)) { 
      sb.appendCodePoint(c); 
      based = true; 
     } else if (Character.isWhitespace(c)) { 
      sb.appendCodePoint(c); 
      based = false; 
     } else { 
      based = false; 
     } 
    } 
    return sb.toString(); 
} 

您可以添加/刪除else if中的支票以擴大/縮小您認爲是「標準」的字符範圍:Character h儘可能多的靜態isXxxx()方法來測試一個角色是否屬於某個類別。

請注意,迭代不是char項,但int碼點。這不僅用於處理UTF-16字符,還用於處理代理對。

+1

這不適用於以兩個UTF-16代碼單元('char')編碼的Unicode代碼點。也不會保留「結合字符」的代碼點,當與前面的基本字符結合時可能不被認爲是「怪異的」。 –

+0

@TomBlodget好吧,你是對的。我更新了處理代理對和修飾符字符的答案。感謝您的寶貴通知。 –