Cómo dividir una cadena por espacio

Resuelto safari asked hace 13 años • 18 respuestas

Necesito dividir mi String por espacios. Para esto probé:

str = "Hello I'm your String";
String[] splited = str.split(" ");

Pero no parece funcionar.

safari avatar Oct 26 '11 13:10 safari
Aceptado

Lo que tienes debería funcionar. Sin embargo, si los espacios proporcionados por defecto son... ¿algo más? Puedes usar la expresión regular de espacios en blanco:

str = "Hello I'm your String";
String[] splited = str.split("\\s+");

Esto hará que cualquier número de espacios consecutivos divida su cadena en tokens.

corsiKa avatar Oct 26 '2011 06:10 corsiKa

Si bien la respuesta aceptada es buena, tenga en cuenta que terminará con una cadena vacía inicial si su cadena de entrada comienza con un espacio en blanco. Por ejemplo, con:

String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");

El resultado será:

splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";

Por lo tanto, es posible que desees recortar la cuerda antes de dividirla:

String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");

[editar]

Además de la trimadvertencia, es posible que desee considerar el carácter Unicode de espacio sin separación ( U+00A0). Este carácter se imprime como un espacio normal en una cadena y, a menudo, se esconde en texto copiado y pegado de editores de texto enriquecido o páginas web. No se controlan mediante .trim()qué pruebas de caracteres eliminar usando c <= ' '; \sTampoco los atrapará.

En su lugar, puede usarlo \p{Blank}, pero también debe habilitar la compatibilidad con caracteres Unicode, lo cual el normal splitno funciona. Por ejemplo, esto funcionará, Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words)pero no funcionará trim.

A continuación se demuestra el problema y se proporciona una solución. Está lejos de ser óptimo confiar en expresiones regulares para esto, pero ahora que Java tiene una representación de bytes de 8 bits/16 bits, una solución eficiente para esto se vuelve bastante larga.

public class SplitStringTest {
    static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}*$", UNICODE_CHARACTER_CLASS);
    static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}+", UNICODE_CHARACTER_CLASS);

    public static String[] trimSplitUnicodeBySpace(String str) {
        Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
        boolean ignored = trimMatcher.matches();
        return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
    }

    @Test
    public void test() {
        String words = " Hello    I'm\u00A0your String\u00A0";
        // non-breaking space here --^ and there -----^

        String[] split = words.split(" ");
        String[] trimAndSplit = words.trim().split(" ");
        String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
        String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);

        System.out.println("words: [" + words + "]");
        System.out.println("split: [" + String.join("][", split) + "]");
        System.out.println("trimAndSplit: [" + String.join("][", trimAndSplit) + "]");
        System.out.println("splitUnicode: [" + String.join("][", splitUnicode) + "]");
        System.out.println("trimAndSplitUnicode: [" + String.join("][", trimAndSplitUnicode) + "]");
    }
}

Resultados en:

words: [ Hello    I'm your String ]
split: [][Hello][][][][I'm your][String ]
trimAndSplit: [Hello][][][][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]
GaspardP avatar May 13 '2015 16:05 GaspardP

Creo que poner una expresión regular entre paréntesis str.split debería resolver el problema. El método Java String.split() se basa en expresiones regulares, por lo que lo que necesitas es:

str = "Hello I'm your String";
String[] splitStr = str.split("\\s+");
rbrtl avatar Oct 26 '2011 07:10 rbrtl