2009-09-17 20 views
36

Il metodo String.trim() del JDK è piuttosto ingenuo e rimuove solo i caratteri di controllo ascii.Come tagliare correttamente gli spazi bianchi da una stringa in Java?

Apache Commons 'StringUtils.strip() è leggermente migliore, ma utilizza il JDK Character.isWhitespace(), che doesn't recognize non-breaking space as whitespace.

Quindi quale sarebbe il modo più completo, compatibile con Unicode, sicuro e corretto per tagliare una stringa in Java?

E per inciso, c'è una libreria migliore di commons-lang che dovrei usare per questo genere di cose?

risposta

55

Google ha reso disponibili guava-libraries di recente. Si may have quello che stai cercando:

CharMatcher.inRange('\0', ' ').trimFrom(str) 

è equivalente a String.trim(), ma è possibile personalizzare cosa tagliare, fare riferimento al JavaDoc.

Per esempio, ha its own definition of WHITESPACE che si differenzia dal JDK e si definiscono secondo l'ultimo standard Unicode, in modo da che cosa avete bisogno può essere scritto come:

CharMatcher.WHITESPACE.trimFrom(str) 
+2

upvoted per avermi fatto sentire come un coglione – itsadok

+0

Grazie per il puntatore Guava. Mi ero perso. – CPerkins

+1

Suggerimento: ['trimAndCollapseFrom'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html#trimAndCollapseFrom (java.lang.CharSequence,% 20char) ritaglia l'esterno della stringa e sostituisce anche i valori duplicati all'interno della stringa. –

2

Ho sempre trovato trim funzionare abbastanza bene per quasi tutti gli scenari.

Tuttavia, se si vuole veramente per includere più caratteri, è possibile modificare il metodo strip da commons-lang per includere non solo il test per Character.isWhitespace, ma anche per Character.isSpaceChar che sembra di essere ciò che manca. Vale a dire, le righe seguenti, rispettivamente stripStart e stripEnd,:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
7

Giuro ho visto solo questo dopo che ho postato la domanda: Google ha appena rilasciato Guava, una libreria di utilità Java di base.

non ho ancora provato questo, ma da quello che posso dire, questo è pienamente compatibile Unicode:

String s = " \t testing \u00a0" 
s = CharMatcher.WHITESPACE.trimFrom(s); 
+2

Haha, ho fornito la stessa risposta solo 5 minuti prima, ma poi l'ho modificato per includere il codice esatto che è necessario utilizzare, e appena visto il tuo commento lo hai trovato tu stesso. – CrazyCoder

2

E 'davvero difficile definire ciò che costituisce gli spazi bianchi. A volte uso spazi non distruttibili solo per assicurarmi che non vengano spogliati. Quindi sarà difficile trovare una libreria per fare esattamente quello che vuoi.

Io uso il mio assetto() se voglio tagliare ogni spazio bianco. Ecco la funzione che uso per verificare la presenza di spazi bianchi,

public static boolean isWhitespace (int ch) 
    { 
    if (ch == ' ' || (ch >= 0x9 && ch <= 0xD)) 
     return true; 
    if (ch < 0x85) // short-circuit optimization. 
     return false; 
    if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E) 
     return true; 
    if (ch < 0x2000 || ch > 0x3000) 
     return false; 
    return ch <= 0x200A || ch == 0x2028 || ch == 0x2029 
     || ch == 0x202F || ch == 0x205F || ch == 0x3000; 
    } 
+9

Si prega di nome quelle costanti magiche .. –

+6

ZZ Coder - tu dici, "sarà difficile trovare una libreria per fare esattamente quello che vuoi." Non vero! Dire che si desidera abbinare tutti gli spazi bianchi _except_ a \ u00a0 (spazio non di rottura). Facile: CharMatcher.WHITESPACE.and (CharMatcher.isNot ('\ u00a0')). TrimFrom (input) –

+2

@KevinBourrillion voleva semplicemente inviare un grande "ringraziamento" per 'CharMatcher.WHITESPACE'. 'String # trim()' fallisce così tanto con Unicode. –

0

ho fatto piccole modifiche sul metodo di assetto() di Java e supporta il metodo characters.This non ASCII corre più veloce rispetto alla maggior parte delle implementazioni.

public static String trimAdvanced(String value) { 

     Objects.requireNonNull(value); 

     int strLength = value.length(); 
     int len = value.length(); 
     int st = 0; 
     char[] val = value.toCharArray(); 

     if (strLength == 0) { 
      return ""; 
     } 

     while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) { 
      st++; 
      if (st == strLength) { 
       break; 
      } 
     } 
     while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) { 
      len--; 
      if (len == 0) { 
       break; 
      } 
     } 


     return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value; 
    } 
Problemi correlati