example - ¿Cuántos espacios eliminará Java String.trim()?
trim android example (17)
Del código fuente (descompilado):
public String trim()
{
int i = this.count;
int j = 0;
int k = this.offset;
char[] arrayOfChar = this.value;
while ((j < i) && (arrayOfChar[(k + j)] <= '' ''))
++j;
while ((j < i) && (arrayOfChar[(k + i - 1)] <= '' ''))
--i;
return (((j > 0) || (i < this.count)) ? substring(j, i) : this);
}
Los dos while
puedes ver significan que todos los personajes cuyo unicode está debajo del carácter del espacio, al principio y al final, se eliminan.
En Java, tengo una cadena como esta:
" content ".
Will String.trim()
eliminará todos los espacios en estos lados o solo un espacio en cada uno?
Desde documentos java (fuente de clase String),
/**
* Returns a copy of the string, with leading and trailing whitespace
* omitted.
* <p>
* If this <code>String</code> object represents an empty character
* sequence, or the first and last characters of character sequence
* represented by this <code>String</code> object both have codes
* greater than <code>''\u0020''</code> (the space character), then a
* reference to this <code>String</code> object is returned.
* <p>
* Otherwise, if there is no character with a code greater than
* <code>''\u0020''</code> in the string, then a new
* <code>String</code> object representing an empty string is created
* and returned.
* <p>
* Otherwise, let <i>k</i> be the index of the first character in the
* string whose code is greater than <code>''\u0020''</code>, and let
* <i>m</i> be the index of the last character in the string whose code
* is greater than <code>''\u0020''</code>. A new <code>String</code>
* object is created, representing the substring of this string that
* begins with the character at index <i>k</i> and ends with the
* character at index <i>m</i>-that is, the result of
* <code>this.substring(<i>k</i>, <i>m</i>+1)</code>.
* <p>
* This method may be used to trim whitespace (as defined above) from
* the beginning and end of a string.
*
* @return A copy of this string with leading and trailing white
* space removed, or this string if it has no leading or
* trailing white space.
*/
public String trim() {
int len = count;
int st = 0;
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[off + st] <= '' '')) {
st++;
}
while ((st < len) && (val[off + len - 1] <= '' '')) {
len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}
Tenga en cuenta que después de obtener inicio y longitud, llama al método de subcadena de la clase String.
Eliminará todos los espacios en ambos lados.
En caso de duda, escriba una prueba unitaria:
@Test
public void trimRemoveAllBlanks(){
assertThat(" content ".trim(), is("content"));
}
NB : por supuesto, la prueba (para JUnit + Hamcrest) no falla
Para mantener solo una instancia para String, puede usar lo siguiente.
str = " Hello ";
o
str = str.trim();
Entonces, el valor de str
String será str = "Hello"
Según los documentos de Java aquí , el .trim()
reemplaza a ''/ u0020'' que se conoce comúnmente como espacios en blanco.
Pero tome nota, el ''/ u00A0'' ( Unicode NO-BREAK SPACE
) también se ve como un espacio en blanco, y .trim()
NO eliminará esto. Esto es especialmente común en HTML.
Para eliminarlo, uso:
tmpTrimStr = tmpTrimStr.replaceAll("//u00A0", "");
Un ejemplo de este problema fue discutido aquí .
Si desea verificar qué método usará, puede usar BeanShell . Es un lenguaje de scripting diseñado para estar lo más cerca posible de Java. En general, se interpreta Java con algunas relajaciones. Otra opción de este tipo es el lenguaje Groovy . Ambos lenguajes de scripting proporcionan un conveniente conocimiento del ciclo Read-Eval-Print a partir de los idiomas interpretados. Entonces puede ejecutar la consola y simplemente escribir:
" content ".trim();
Verá "content"
como resultado después de presionar Enter
(o Ctrl+R
en la consola de Groovy).
Si su entrada String es:
String a = " abc ";
System.out.println(a);
Sí, la salida será "abc"; Pero si su entrada String es:
String b = " This is a test "
System.out.println(b);
La salida será This is a test
Entonces, recortar solo elimina espacios antes de su primer carácter y después de su último carácter en la cadena e ignora los espacios interiores. Esta es una parte de mi código que optimiza ligeramente el método incorporado de recorte de String
eliminando los espacios interiores y elimina espacios antes y después de su primer y último carácter en la cadena. Espero eso ayude.
public static String trim(char [] input){
char [] output = new char [input.length];
int j=0;
int jj=0;
if(input[0] == '' '' ) {
while(input[jj] == '' '')
jj++;
}
for(int i=jj; i<input.length; i++){
if(input[i] !='' '' || ( i==(input.length-1) && input[input.length-1] == '' '')){
output[j]=input[i];
j++;
}
else if (input[i+1]!='' ''){
output[j]='' '';
j++;
}
}
char [] m = new char [j];
int a=0;
for(int i=0; i<m.length; i++){
m[i]=output[a];
a++;
}
return new String (m);
}
Trim () funciona para ambos lados.
Una cosa muy importante es que una cadena hecha completamente de "espacios en blanco" devolverá una cadena vacía.
si una string sSomething = "xxxxx"
, donde x
representan espacios en blanco, sSomething.trim()
devolverá una cadena vacía.
si una string sSomething = "xxAxx"
, donde x
representan espacios en blanco, sSomething.trim()
devolverá A
si sSomething ="xxSomethingxxxxAndSomethingxElsexxx"
, sSomething.trim()
devolverá SomethingxxxxAndSomethingxElse
, observe que el número de x
entre las palabras no se altera.
Si desea una cadena empaquetada ordenada, combine trim()
con expresiones regulares como se muestra en esta publicación: ¿Cómo eliminar espacios blancos duplicados en una cadena usando Java? .
El orden no tiene sentido para el resultado pero trim()
primero sería más eficiente. Espero eso ayude.
Una cosa para señalar, sin embargo, es que String.trim tiene una definición peculiar de "espacio en blanco". No elimina el espacio en blanco Unicode, sino que también elimina los caracteres de control ASCII que no considere espacios en blanco.
Este método se puede usar para recortar espacios en blanco desde el principio y el final de una cadena; de hecho, recorta todos los caracteres de control ASCII también.
Si es posible, puede usar Commons Lang''s StringUtils.strip (), que también maneja el espacio en blanco Unicode (y también es nulo).
Ver API para la clase String:
Devuelve una copia de la cadena, con el espacio en blanco inicial y final omitido.
El espacio en blanco en ambos lados se elimina:
Tenga en cuenta que trim()
no cambia la instancia de String, sino que devolverá un nuevo objeto:
String original = " content ";
String withoutWhitespace = original.trim();
// original still refers to " content "
// and withoutWhitespace refers to "content"
Javadoc for String tiene todos los detalles. Elimina el espacio en blanco (espacio, pestañas, etc.) de ambos extremos y devuelve una nueva cadena.
Devuelve : una copia de esta cadena con el espacio en blanco inicial y final eliminado, o esta cadena si no tiene espacio en blanco inicial o final.
~ Citado de Java 1.5.0 documentos
(Pero ¿por qué no lo pruebas y lo ves por ti mismo?)
trim()
eliminará todos los espacios en blanco iniciales y finales. Pero ten en cuenta: tu cadena no ha cambiado. trim()
devolverá una nueva instancia de cadena en su lugar.
Ejemplo de trim()
de Java trim()
eliminando espacios:
public class Test
{
public static void main(String[] args)
{
String str = "/n/t This is be trimmed./n/n";
String newStr = str.trim(); //removes newlines, tabs and spaces.
System.out.println("old = " + str);
System.out.println("new = " + newStr);
}
}
SALIDA
old =
This is a String.
new = This is a String.
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("//s+", " ");