Cadena Java dividida con "." (punto) [duplicar]
¿ Por qué arroja la segunda línea de este código ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
Mientras esto funciona:
String driveLetter = filename.split("/")[0];
Yo uso Java 7.
Debes escapar del punto si quieres dividir en un punto literal :
String extensionRemoved = filename.split("\\.")[0];
De lo contrario, se dividirá según la expresión regular .
, que significa "cualquier carácter".
Tenga en cuenta la doble barra invertida necesaria para crear una única barra invertida en la expresión regular.
Obtienes un ArrayIndexOutOfBoundsException
porque tu cadena de entrada es solo un punto, es decir "."
, que es un caso extremo que produce una matriz vacía cuando se divide en un punto; split(regex)
elimina todos los espacios en blanco finales del resultado, pero como dividir un punto sobre otro deja solo dos espacios en blanco, después de eliminar los espacios en blanco finales, queda una matriz vacía.
Para evitar obtener un ArrayIndexOutOfBoundsException
para este caso extremo, use la versión sobrecargada de split(regex, limit)
, que tiene un segundo parámetro que es el límite de tamaño para la matriz resultante. Cuando limit
es negativo , el comportamiento de eliminar los espacios en blanco finales de la matriz resultante está deshabilitado:
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
es decir, cuando filename
es solo un punto "."
, la llamada filename.split("\\.", -1)[0]
devolverá un espacio en blanco, pero la llamada filename.split("\\.")[0]
arrojará un ArrayIndexOutOfBoundsException
.
El punto "." es un carácter especial en el motor de expresiones regulares de Java, por lo que debe usar "\\". para escapar de este personaje:
final String extensionRemoved = filename.split("\\.")[0];
Esto se debe a que .
es un carácter reservado en una expresión regular y representa cualquier carácter. En su lugar, deberíamos utilizar la siguiente declaración:
String extensionRemoved = filename.split("\\.")[0];
Creo que deberías escapar del punto. Intentar:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
De lo contrario, el punto se interpreta como cualquier carácter en las expresiones regulares.