Cadena Java dividida con "." (punto) [duplicar]

Resuelto Ali Ismayilov asked hace 11 años • 4 respuestas

¿ 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.

Ali Ismayilov avatar Feb 12 '13 19:02 Ali Ismayilov
Aceptado

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 ArrayIndexOutOfBoundsExceptionporque 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 ArrayIndexOutOfBoundsExceptionpara 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 limites 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 filenamees solo un punto ".", la llamada filename.split("\\.", -1)[0]devolverá un espacio en blanco, pero la llamada filename.split("\\.")[0]arrojará un ArrayIndexOutOfBoundsException.

Bohemian avatar Feb 12 '2013 12:02 Bohemian

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];
aimhaj avatar Feb 12 '2013 12:02 aimhaj

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];
Gabriele Mariotti avatar Feb 12 '2013 12:02 Gabriele Mariotti

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.

Ivaylo Strandjev avatar Feb 12 '2013 12:02 Ivaylo Strandjev