Cómo dividir una cadena por espacio
Necesito dividir mi String por espacios. Para esto probé:
str = "Hello I'm your String";
String[] splited = str.split(" ");
Pero no parece funcionar.
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.
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 trim
advertencia, 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 <= ' '
; \s
Tampoco los atrapará.
En su lugar, puede usarlo \p{Blank}
, pero también debe habilitar la compatibilidad con caracteres Unicode, lo cual el normal split
no 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]
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+");