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.