¿Cómo verifico que una cadena de Java no son todos espacios en blanco?

132

¿Quiero comprobar que Java String o la matriz de caracteres no se compone solo de espacios en blanco, usando Java?

Esta es una pregunta muy similar, excepto que es Javascript:
¿Cómo puedo verificar si la cadena contiene caracteres y espacios en blanco, no solo espacios en blanco?

EDITAR : eliminé un poco sobre los caracteres alfanuméricos, por lo que tiene más sentido.

Ankur
fuente
3
Tenga en cuenta que hay muchas definiciones diferentes de espacios en blanco: spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ ¿Cuál desea? O luego dices "tiene un carácter alfanumérico", que es algo completamente diferente. Por favor aclarar
Kevin Bourrillion
Disculpas por la confusión ... no todos los espacios en blanco son la clave, básicamente si tiene todos los espacios en blanco, quiero excluirlos, porque no tiene contenido.
Ankur
1
Con JDK / 11 puede hacer uso de laString.isBlank API para lo mismo.
Naman

Respuestas:

224

La solución más corta que se me ocurre:

if (string.trim().length() > 0) ...

Esto solo comprueba el espacio en blanco (no). Si desea verificar determinadas clases de caracteres, debe usar el poderoso match()con una expresión regular como:

if (string.matches(".*\\w.*")) ...

... que comprueba al menos un carácter alfanumérico (ASCII).

Carl Smotricz
fuente
9
FWIW: Esperaría que la primera solución sea considerablemente más rápida.
Stephen C
2
@Stephen C: ¡Absolutamente! Pero como señaló @Uri, tengo que resolver dos problemas diferentes gracias a la ambigüedad de la pregunta :) Además, rara vez uso matches(): para el rendimiento, generalmente almaceno el Patternen un final static. Paga si el mismo código se ejecuta con frecuencia.
Carl Smotricz
3
@Andreas_D: Je, recibí mis pedidos! El OP dijo que quería verificar una cadena o una matriz de caracteres, ¡nunca dijo nada sobre nulos! :) * comprueba la letra pequeña en el contrato * " nullno es una cadena!"
Carl Smotricz
1
Además, "\\ w" solo coincide con un subconjunto limitado de caracteres que no son espacios en blanco en lugar de todos los que no son espacios en blanco, ya que se refiere a "caracteres de palabras" definidos como AZ, az, 0-9 y subrayado.
Rob Raisch
2
Usé your_string.trim (). IsEmpty () e hice el trabajo por mí
Neri
59

Usaría la biblioteca Lang de Apache Commons. Tiene una clase llamada StringUtils que es útil para todo tipo de operaciones de String. Para verificar si una cadena no es todos espacios en blanco, puede usar lo siguiente:

StringUtils.isBlank(<your string>)

Aquí está la referencia: StringUtils.isBlank

Chris J
fuente
8
Prefiero esta solución en comparación con el uso de la respuesta elegida. Esto también verificará la cadena == nulo
Richard
Esto ahora es incorrecto. StringUtils.isEmptyahora devolverá falso si pasa "".
James Spence
53

Ligeramente más corto que lo mencionado por Carl Smotricz:

!string.trim().isEmpty();
cal roja
fuente
10
¡Ustedes jóvenes whippersnappers y su nuevo truco post-Java-1.6! En serio, al menos un proyecto en mi empresa todavía se ejecuta en Java 1.4 (suspiro).
Carl Smotricz
¿Corta? Si. Personalmente, me gusta el estilo de codificación más detallado
Michel
9

Si está utilizando Java 11 , el nuevo isBlankmétodo de cadena será útil:

!s.isBlank();

Si está utilizando Java 8, 9 o 10 , puede crear una secuencia simple para verificar que una cadena no sea solo un espacio en blanco:

!s.chars().allMatch(Character::isWhitespace));

Además de no requerir bibliotecas de terceros, como Apache Commons Lang, estas soluciones tienen la ventaja de manejar cualquier carácter de espacio en blanco, y no solo ' 'espacios simples , como lo haría una trimsolución basada en lo sugerido en muchas otras respuestas. Puede consultar los Javadocs para obtener una lista exhaustiva de todos los tipos de espacios en blanco admitidos. Tenga en cuenta que las cadenas vacías también están cubiertas en ambos casos.

Pyves
fuente
5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

Tenga en cuenta el uso de la barra diagonal inversa cap-S, que significa "char no espacio en blanco"

Apuesto a que esta es la solución más simple (¿y quizás la más rápida?).

Rob Raisch
fuente
2
Vamos a intentarlo: String year="1995"; year.matches("\\S"); will return falseentonces esta no es la solución correcta. : |
Nhat Dinh
66
Nhat, tienes razón, aunque no puedo explicar por qué. De acuerdo con los documentos de Java, String.matches verifica si una cadena dada coincide con una expresión regular. Un poco de experimentación muestra que esto no es del todo exacto, ya que esta función parece coincidir SOLO si la expresión regular proporcionada coincide con TODA la cadena. Por lo tanto, cambiar la expresión regular anterior ("\\ S") a "^. * \\ S. * $" Funcionará como se esperaba, aunque este comportamiento no está correctamente documentado y parece diferir sustancialmente de cualquier otra implementación de coincidencia de cadenas usando expresiones regulares.
Rob Raisch
4

Esta respuesta se centra más en la nota al margen " es decir, tiene al menos un carácter alfanumérico ". Además de eso, no agrega demasiado a la otra solución (anterior), excepto que no te hace daño con NPE en caso de que la cadena sea null.

Queremos falsesi (1) s está nullo (2) s está vacío o (3) s solo contiene caracteres en blanco.

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}
Andreas Dolk
fuente
4

Si solo está buscando espacios en blanco y no le importa nulo, puede usar org.apache.commons.lang.StringUtils.isWhitespace (String str),

StringUtils.isWhitespace(String str);

(Comprueba si la cadena contiene solo espacios en blanco).

Si también desea verificar nulo (incluido el espacio en blanco), entonces

StringUtils.isBlank(String str);
Arun
fuente
Se recomienda isBlank (String) ya que también maneja la validación nula.
Sachidananda Naik
2

Con Java-11 +, puede hacer uso de la String.isBlankAPI para verificar si la cadena dada no está compuesta de espacios en blanco:

String str1 = "    ";
System.out.println(str1.isBlank()); // made up of all whitespaces, prints true

String str2 = "    a";
System.out.println(str2.isBlank()); // prints false

El javadoc para lo mismo es:

/**
 * Returns {@code true} if the string is empty or contains only
 * {@link Character#isWhitespace(int) white space} codepoints,
 * otherwise {@code false}.
 *
 * @return {@code true} if the string is empty or contains only
 *         {@link Character#isWhitespace(int) white space} codepoints,
 *         otherwise {@code false}
 *
 * @since 11
 */
public boolean isBlank()
Naman
fuente
1

El método de recorte debería funcionar muy bien para usted.

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()

Devuelve una copia de la cadena, con espacios en blanco iniciales y finales omitidos. Si este objeto String representa una secuencia de caracteres vacía, o los primeros y últimos caracteres de la secuencia de caracteres representados por este objeto String tienen códigos mayores que '\ u0020' (el carácter de espacio), se devuelve una referencia a este objeto String.

De lo contrario, si no hay ningún carácter con un código mayor que '\ u0020' en la cadena, se crea y devuelve un nuevo objeto de cadena que representa una cadena vacía.

De lo contrario, sea k el índice del primer carácter de la cadena cuyo código sea mayor que '\ u0020', y sea m el índice del último carácter de la cadena cuyo código sea mayor que '\ u0020'. Se crea un nuevo objeto String, que representa la subcadena de esta cadena que comienza con el carácter en el índice k y termina con el carácter en el índice m, es decir, el resultado de this.substring (k, m + 1).

Este método puede usarse para recortar espacios en blanco desde el principio y el final de una cadena; de hecho, también recorta todos los caracteres de control ASCII.

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. Espacio en blanco inicial o final.

Puede recortar y luego comparar con una cadena vacía o posiblemente verificar la longitud para 0.

Corey Ogburn
fuente
Enlace en respuesta está muerto - 404 | Lo sentimos, la página no existe o ya no está disponible .
Pang
0

Alternativa:

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }
OscarRyz
fuente
1
\\ s * coincidirá con todas las cadenas con o sin espacios en blanco. ¿Quizás te refieres a \\ s +?
Rob Raisch
0

trim () y otras expresiones regulares mencionadas no funcionan para todos los tipos de espacios en blanco

es decir: Carácter Unicode 'SEPARADOR DE LÍNEA' http://www.fileformat.info/info/unicode/char/2028/index.htm

Funciones de Java Character.isWhitespace () cubre todas las situaciones.

Es por eso que ya se debe usar la solución StringUtils.isWhitespace (String) / o StringUtils.isBlank (String) .

andreyro
fuente
0

Solo una comparación de rendimiento en openjdk 13, Windows 10. Para cada uno de estos textos:

"abcd"
"    "
" \r\n\t"
" ab "
" \n\n\r\t   \n\r\t\t\t   \r\n\r\n\r\t \t\t\t\r\n\n"
"lorem ipsum dolor sit amet  consectetur adipisici elit"
"1234657891234567891324569871234567891326987132654798"

ejecutó una de las siguientes pruebas:

// trim + empty
input.trim().isEmpty()

// simple match
input.matches("\\S")

// match with precompiled pattern
final Pattern PATTERN = Pattern.compile("\\S");
PATTERN.matcher(input).matches()

// java 11's isBlank
input.isBlank()

cada 10,000,000 veces.

Los resultados:

METHOD    min   max   note
trim:      18   313   much slower if text not trimmed
match:   1799  2010   
pattern:  571   662   
isBlank:   60   338   faster the earlier hits the first non-whitespace character

Sorprendentemente, el trim + empty es el más rápido. Incluso si necesita construir el texto recortado. Aún más rápido que el simple bucle for buscando un solo carácter sin espacios en blanco ...

EDITAR: cuanto más largo sea el texto, más números difieren. Recortar texto largo lleva más tiempo que un simple bucle. Sin embargo, las expresiones regulares siguen siendo la solución más lenta.

martlin
fuente
0

Si bien personalmente preferiría !str.isBlank(), como otros ya sugirieron (o str -> !str.isBlank()como un predicado) str.trim(), se usaría una versión más moderna y eficiente del enfoque mencionado anteriormente, str.strip()considerando los nulos como "espacios en blanco":

if (str != null && str.strip().length() > 0) {...}

Por ejemplo, como Predicate, para usar con flujos, por ejemplo, en una prueba unitaria:

@Test
public void anyNonEmptyStrippedTest() {
    String[] strings = null;
    Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0;
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" };
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" };
}
fozzybear
fuente