Veo solo soluciones aquí pero no una explicación completa del problema, así que decidí publicar esta respuesta
Problema
Necesitas saber algunas cosas sobre text.split(delim)
. split
método:
- acepta como argumento la expresión regular (regex) que describe el delimitador en el que queremos dividir,
- if
delim
existe al final de text
like en a,b,c,,
(donde está el delimitador ,
) split
al principio creará una matriz como, ["a" "b" "c" "" ""]
pero como en la mayoría de los casos no necesitamos estas cadenas vacías finales, también las elimina automáticamente para nosotros. Entonces crea otra matriz sin estas cadenas vacías finales y la devuelve .
También necesita saber que el punto.
es un carácter especial en expresiones regulares . Representa cualquier carácter (excepto los separadores de línea, pero esto se puede cambiar con una Pattern.DOTALL
bandera).
Entonces, para cadenas como "abc"
si dividiéramos el "."
split
método,
- crear una matriz como
["" "" "" ""]
,
- pero dado que esta matriz contiene solo cadenas vacías y todas están al final, se eliminarán (como se muestra en el segundo punto anterior)
lo que significa que obtendremos como resultado una matriz vacía []
(sin elementos, ni siquiera una cadena vacía), por lo que no podemos usar fn[0]
porque no hay índice 0.
Solución
Para resolver este problema, simplemente necesita crear una expresión regular que represente un punto. Para hacerlo, tenemos que escapar de eso .
. Hay pocas maneras de hacerlo, pero más sencilla es probablemente usando \
(que en la cadena necesita ser escrita como "\\"
porque \
también es especial y no requiere otro \
que se escapó).
Entonces, la solución a su problema puede parecer
String[] fn = filename.split("\\.");
Prima
También puedes usar otras formas de escapar de ese punto como
- usando la clase de personaje
split("[.]")
- envolviéndolo en una cita
split("\\Q.\\E")
- usando la instancia de patrón adecuada con
Pattern.LITERAL
bandera
- o simplemente use
split(Pattern.quote("."))
y deje que regex se escape por usted.