Je me demande si je vais couper une chaîne dans .
le bon sens? Mon code est:
String[] fn = filename.split(".");
return fn[0];
Je n'ai besoin que de la première partie de la chaîne, c'est pourquoi je retourne le premier élément. Je demande parce que j'ai remarqué dans l'API que cela .
signifie n'importe quel caractère, alors maintenant je suis coincé.
Je ne vois que des solutions ici mais pas d'explication complète du problème, j'ai donc décidé de poster cette réponse
Problème
Vous devez savoir peu de choses sur
text.split(delim)
.split
méthode:delim
existe à la fin detext
like ina,b,c,,
(où se trouve le délimiteur,
)split
dans un premier temps créera un tableau comme["a" "b" "c" "" ""]
mais puisque dans la plupart des cas nous n'avons pas vraiment besoin de ces chaînes vides de fin, il les supprime également automatiquement pour nous. Il crée donc un autre tableau sans ces chaînes vides de fin et le renvoie .Vous devez également savoir que le point
.
est un caractère spécial dans les regex . Il représente n'importe quel caractère (sauf les séparateurs de ligne mais cela peut être changé avec unPattern.DOTALL
drapeau).Donc, pour une chaîne comme
"abc"
si nous divisions sur la"."
split
méthode["" "" "" ""]
,ce qui signifie que nous obtiendrons comme résultat un tableau vide
[]
(sans élément, pas même une chaîne vide), donc nous ne pouvons pas l'utiliserfn[0]
car il n'y a pas d'index 0.Solution
Pour résoudre ce problème, vous devez simplement créer une expression régulière qui représente le point. Pour ce faire, nous devons échapper à cela
.
. Il y a peu de façons de le faire, mais le plus simple est probablement d'utiliser\
(ce qui dans String doit être écrit"\\"
car il\
est également spécial là-bas et nécessite qu'un autre\
soit échappé).La solution à votre problème peut donc ressembler à
Prime
Vous pouvez également utiliser d'autres moyens pour échapper à ce point, comme
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
drapeausplit(Pattern.quote("."))
et laissez regex s'échapper pour vous.la source
split("[.]")
la méthode String # split (String) utilise des expressions régulières. Dans les expressions régulières, le "." caractère signifie "n'importe quel caractère". Vous pouvez éviter ce comportement en échappant au "."
ou dire à la méthode de fractionnement de se séparer à une classe de caractères:
Les classes de caractères sont des collections de caractères. Tu pourrais écrire
et le nom de fichier serait divisé à chaque "-", ".", ";", "l", "d" ou "7". À l'intérieur des classes de caractères, le "." n'est pas un caractère spécial ("métacaractère").
la source
Comme DOT (.) Est considéré comme un caractère spécial et que la méthode de fractionnement de String attend une expression régulière que vous devez faire comme ceci -
En java, les caractères spéciaux doivent être échappés avec un "\" mais comme "\" est également un caractère spécial en Java, vous devez à nouveau l'échapper avec un autre "\"!
la source
la source
Ne serait-il pas plus efficace d'utiliser
si vous voulez seulement ce qui se passe jusqu'au premier point?
la source
Habituellement, ce n'est PAS une bonne idée de le démasquer à la main. Il existe une méthode dans la classe Pattern pour cette tâche:
la source
Le split doit prendre regex comme argument ... Changez simplement
"."
en"\\."
la source
Remarque: il faut faire plus attention avec cet extrait de code, même après l'échappement du point!
Si le nom de fichier est juste la chaîne ".", Alors fn finira toujours par avoir une longueur de 0 et fn [0] lancera toujours une exception!
En effet, si le motif correspond au moins une fois, alors split supprimera toutes les chaînes vides de fin (donc aussi celle avant le point!) Du tableau, laissant un tableau vide à retourner.
la source
La solution qui a fonctionné pour moi est la suivante
la source
Utiliser ApacheCommons, c'est le plus simple:
Notez qu'il extrait également un nom de fichier du chemin complet.
la source
split
prend une expression régulière comme argument. Donc, vous devriez passer"\."
au lieu de"."
car"."
est un métacaractère dans regex.la source