A divisão usa expressões regulares, onde '.' é um caractere especial que significa qualquer coisa. Você precisa escapar dela se realmente quiser que corresponda a '.' personagem:
String[] fn = filename.split("\\.");
(um '\' para escapar de '.' na expressão regular e o outro para escapar do primeiro na string Java)
Além disso, eu não sugeriria retornar fn [0], pois se você tiver um arquivo chamado something.blabla.txt
, que é um nome válido, você não retornará o nome real do arquivo. Em vez disso, acho melhor se você usar:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
Andrei Fierbinteanu
fonte
Vejo apenas soluções aqui, mas nenhuma explicação completa do problema, então decidi postar esta resposta
Problema
Você precisa saber algumas coisas sobre
text.split(delim)
.split
método:delim
existe no final detext
like ina,b,c,,
(onde o delimitador é,
)split
a princípio criará um array like,["a" "b" "c" "" ""]
mas como na maioria dos casos não precisamos realmente dessas strings vazias, ele também as remove automaticamente para nós. Portanto, ele cria outro array sem essas strings vazias no final e o retorna .Você também precisa saber que o ponto
.
é um caractere especial no regex . Ele representa qualquer caractere (exceto separadores de linha, mas isso pode ser alterado com oPattern.DOTALL
sinalizador).Então, para strings como
"abc"
se dividíssemos no"."
split
método,["" "" "" ""]
,o que significa que obteremos como resultado um array vazio
[]
(sem elementos, nem mesmo uma string vazia), então não podemos usarfn[0]
porque não há índice 0.Solução
Para resolver este problema, você simplesmente precisa criar um regex que representará o ponto. Para fazer isso, precisamos escapar disso
.
. Existem algumas maneiras de fazer isso, mas a mais simples é provavelmente usando\
(que em String precisa ser escrito"\\"
porque\
também é especial lá e requer que outro\
tenha escape).Portanto, a solução para o seu problema pode parecer
Bônus
Você também pode usar outras maneiras de escapar desse ponto, como
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
bandeirasplit(Pattern.quote("."))
e deixe o regex fazer o escape para você.fonte
split("[.]")
o método String # split (String) usa expressões regulares. Em expressões regulares, o "." caractere significa "qualquer caractere". Você pode evitar esse comportamento escapando de "."
ou dizendo ao método de divisão para dividir em uma classe de caracteres:
As classes de personagens são coleções de personagens. Você poderia escrever
e o nome do arquivo seria dividido a cada "-", ".", ";", "l", "d" ou "7". Dentro das classes de personagens, o "." não é um caractere especial ("metacaractere").
fonte
Como DOT (.) É considerado um caractere especial e o método de divisão de String espera uma expressão regular que você precisa fazer assim -
Em java, os caracteres especiais precisam ser escapados com um "\", mas como "\" também é um caractere especial em Java, você precisa escapá-lo novamente com outro "\"!
fonte
fonte
Não seria mais eficiente usar
se você só quer o que vai até o primeiro ponto?
fonte
Normalmente NÃO é uma boa ideia desmascará-lo manualmente. Existe um método na classe Pattern para esta tarefa:
fonte
A divisão deve ter regex como um argumento ... Simplesmente mude
"."
para"\\."
fonte
Nota: Cuidado adicional deve ser tomado com este snippet, mesmo depois que o ponto for escapado!
Se o nome do arquivo for apenas a string ".", Então fn ainda terá comprimento 0 e fn [0] ainda lançará uma exceção!
Isso porque, se o padrão corresponder pelo menos uma vez, a divisão descartará todas as strings vazias posteriores (portanto, também aquela antes do ponto!) Do array, deixando um array vazio para ser retornado.
fonte
A solução que funcionou para mim é a seguinte
fonte
Usar ApacheCommons é mais simples:
Observe que também extrai um nome de arquivo do caminho completo.
fonte
split
leva uma regex como argumento. Portanto, você deve passar em"\."
vez de"."
porque"."
é um metacaractere no regex.fonte