Me pregunto si voy a dividir una cuerda de .
la manera correcta. Mi codigo es:
String[] fn = filename.split(".");
return fn[0];
Solo necesito la primera parte de la cadena, por eso devuelvo el primer elemento. Pregunto porque noté en la API que .
significa cualquier carácter, así que ahora estoy atascado.
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:delim
existe al final detext
like ena,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 unaPattern.DOTALL
bandera).Entonces, para cadenas como
"abc"
si dividiéramos el"."
split
método,["" "" "" ""]
,lo que significa que obtendremos como resultado una matriz vacía
[]
(sin elementos, ni siquiera una cadena vacía), por lo que no podemos usarfn[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
Prima
También puedes usar otras formas de escapar de ese punto como
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
banderasplit(Pattern.quote("."))
y deje que regex se escape por usted.fuente
split("[.]")
el método String # split (String) usa expresiones regulares. En expresiones regulares, el "." carácter significa "cualquier carácter". Puede evitar este comportamiento escapando del "."
o decirle al método split que se divida en una clase de carácter:
Las clases de personajes son colecciones de personajes. Podrías escribir
y el nombre del archivo se dividiría en cada "-", ".", ";", "l", "d" o "7". Dentro de las clases de caracteres, el "." no es un carácter especial ("metacarácter").
fuente
Como DOT (.) Se considera un carácter especial y el método de división de String espera una expresión regular que debe hacer así:
En Java, los caracteres especiales deben escaparse con un "\", pero dado que "\" también es un carácter especial en Java, ¡debe escapar de nuevo con otro "\"!
fuente
fuente
¿No sería más eficiente usar
si solo quieres lo que pasa hasta el primer punto?
fuente
Por lo general, NO es una buena idea desenmascararlo a mano. Hay un método en la clase Pattern para esta tarea:
fuente
La división debe tomar regex como argumento ... Simplemente cambie
"."
a"\\."
fuente
Nota: Se debe tener más cuidado con este fragmento, incluso después de que se haya escapado el punto.
Si el nombre del archivo es solo la cadena ".", Entonces fn terminará teniendo una longitud 0 y fn [0] aún generará una excepción.
Esto se debe a que si el patrón coincide al menos una vez, la división descartará todas las cadenas vacías finales (¡por lo tanto, también la que está antes del punto!) De la matriz, dejando una matriz vacía para devolver.
fuente
La solución que funcionó para mí es la siguiente
fuente
Usar ApacheCommons es más simple:
Tenga en cuenta que también extrae un nombre de archivo de la ruta completa.
fuente
split
toma una expresión regular como argumento. Por lo tanto, debe pasar en"\."
lugar de"."
porque"."
es un metacarácter en expresiones regulares.fuente