Cómo dividir una cadena con cualquier espacio en blanco como delimitadores


555

¿Qué patrón de expresión que me necesita para pasar a java.lang.String.split() dividir una cadena en una matriz de subcadenas utilizando todos los caracteres de espacio en blanco ( ' ', '\t', '\n', etc.) como delimitadores?

Respuestas:


955

Algo en la linea de

myString.split("\\s+");

Esto agrupa todos los espacios en blanco como delimitador.

Entonces, si tengo la cadena:

"Hello[space][tab]World"

Esto debería producir las cadenas "Hello"y "World"omitir el espacio vacío entre el [space]y el [tab].

Como señaló VonC, la barra diagonal inversa debe escaparse, porque Java primero intentaría escapar de la cadena a un carácter especial y enviarlo para que se analice. Lo que quieres es el literal "\s", lo que significa que debes pasar "\\s". Puede ser un poco confuso.

El \\ses equivalente a [ \\t\\n\\x0B\\f\\r].


1
Gracias por el recordatorio. Estaba codificando desde la cadera :)
Henrik Paul

34
Tenga en cuenta que trim()primero debe: trim().split("\\s++")- de lo contrario, por ejemplo, dividir `abc` emitirá dos cadenas vacías primero.
Marcus Junius Brutus

¿Por qué usaste cuatro barras invertidas cerca del final de tu respuesta? es decir. "\\\\s"?
Michael Borkowski

"" .trim (). split ("\\ s +") - la división de cadena vacía le da una longitud de 1. "term" .trim (). split ("\\ s +") - también le da una longitud de 1 .
PaulSchell

88

En la mayoría de los dialectos de expresiones regulares hay un conjunto de resúmenes de caracteres convenientes que puede usar para este tipo de cosas; estos son buenos para recordar:

\w - Coincide con cualquier carácter de palabra.

\W - Coincide con cualquier carácter no verbal.

\s - Coincide con cualquier personaje de espacio en blanco.

\S - Coincide con cualquier cosa menos caracteres de espacio en blanco.

\d - Coincide con cualquier dígito.

\D - Coincide con cualquier cosa excepto dígitos.

La búsqueda de "Chegeheets Regex" debería recompensarlo con muchos resúmenes útiles.



Lea la clase de patrones JavaDoc
Christophe Roussy

64

Para que esto funcione en Javascript , tuve que hacer lo siguiente:

myString.split(/\s+/g)

15
Esto está en Javascript. Yo tampoco estaba prestando atención :)
miracle2k

14
Ups Mi error. Tal vez esta respuesta aún ayudará a otros que se encuentran con este hilo mientras buscan una respuesta de Javascript. :-)
Mike Manard

Jaja, estaba buscando una respuesta para JavaScript, accidentalmente encontré esta pregunta y luego noté tu respuesta antes de irme. +1.
Kris

¡Eso es genial! Me alegra escuchar que esta respuesta resultó útil para alguien, incluso si respondió la pregunta incorrecta. :-)
Mike Manard

Esto también me ayudó mucho, necesitaba dividir los argumentos del servidor :)
ProgrammerPlays


11

También es posible que tenga un espacio UniCode sin interrupción xA0 ...

String[] elements = s.split("[\\s\\xA0]+"); //include uniCode non-breaking

esto me ayuda!
Surasin Tancharoen

10
String string = "Ram is going to school";
String[] arrayOfString = string.split("\\s+");

@Stephan No los vi.
Flecha


2

Dado que es una expresión regular, y supongo que tampoco querría caracteres no alfanuméricos como comas, puntos, etc. que podrían estar rodeados de espacios en blanco (por ejemplo, "uno, dos" debería dar [uno] [dos]), debería ser:

myString.split(/[\s\W]+/)

1

puede dividir una cadena por salto de línea utilizando la siguiente instrucción:

 String textStr[] = yourString.split("\\r?\\n");

puede dividir una cadena por espacios en blanco utilizando la siguiente instrucción:

String textStr[] = yourString.split("\\s+");


-1

Estudia este código .. buena suerte

    import java.util.*;
class Demo{
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        System.out.print("Input String : ");
        String s1 = input.nextLine();   
        String[] tokens = s1.split("[\\s\\xA0]+");      
        System.out.println(tokens.length);      
        for(String s : tokens){
            System.out.println(s);

        } 
    }
}

¿Puedes detallar tu respuesta?
Stephan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.