Secuencia de Java dividida con “.” (Punto)

¿Por qué la segunda línea de este código en Java arroja ArrayIndexOutOfBoundsException ?

 String filename = "D:/some folder/001.docx"; String extensionRemoved = filename.split(".")[0]; 

Si bien funciona a continuación:

 String driveLetter = filename.split("/")[0]; 

Yo uso Java 7.

Necesitas escapar del punto si quieres dividir un punto literal :

 String extensionRemoved = filename.split("\\.")[0]; 

De lo contrario, se está dividiendo en la expresión regular . , lo que significa “cualquier personaje”.
Tenga en cuenta la doble barra invertida necesaria para crear una barra diagonal inversa en la expresión regular.


ArrayIndexOutOfBoundsException una ArrayIndexOutOfBoundsException porque su cadena de entrada es solo un punto, es decir, "." , que es un caso de borde que produce una matriz vacía cuando se divide en punto; split(regex) elimina todos los espacios en blanco finales del resultado, pero como dividir un punto en un punto deja solo dos espacios en blanco, una vez eliminados los espacios en blanco finales, queda un conjunto vacío.

Para evitar obtener una ArrayIndexOutOfBoundsException para este caso límite, 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 el limit es negativo , el comportamiento de eliminar 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 "." , al llamar a filename.split("\\.", -1)[0] se devolverá un espacio en blanco, pero invocando filename.split("\\.")[0] arrojará una ArrayIndexOutOfBoundsException .

“.” es un personaje especial en Java, por lo que debes usar “\\”. para escapar de este personaje:

 final String extensionRemoved = filename.split("\\.")[0]; 

espero que esto ayude

Esto es porque es un personaje reservado en expresión regular, que representa cualquier personaje. En su lugar, debemos usar la siguiente statement:

 String extensionRemoved = filename.split("\\.")[0]; 

Creo que deberías escapar del punto. Tratar:

 String filename = "D:/some folder/001.docx"; String extensionRemoved = filename.split("\\.")[0]; 

De lo contrario, el punto se interpreta como cualquier carácter en expresiones regulares.