Scinde une chaîne avec le point comme séparateur
Je me demande si je vais sur le découpage d'une chaîne sur un .
de la bonne façon? Mon code est:
String[] fn = filename.split(".");
return fn[0];
J'ai seulement besoin 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 qui .
signifie n'importe quel caractère, alors maintenant je suis coincé.
Vous devez vous connecter pour publier un commentaire.
split()
accepte une expression régulière, de sorte que vous devez vous échapper.
de ne pas le considérer comme un regex méta caractère. Voici un exemple :Split utilise des expressions régulières, où les". " est un caractère spécial sens rien. Vous devez vous échapper si vous le voulez vraiment pour correspondre le caractère'.':
(un '\' échapper le". " dans l'expression régulière, et l'autre pour échapper à la première en Java string)
Aussi, je ne dirais pas de retour fn[0] car si vous avez un fichier nommé
something.blabla.txt
, qui est un nom valide, vous ne serez pas en retour le nom de fichier réel. Au lieu de cela je pense que c'est mieux si vous utilisez:la Chaîne#split(String) méthode 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 problème en soit de s'échapper de la "."
ou disent la méthode split de split à une classe de personnage:
Les classes de caractères sont des ensembles de caractères. Vous pouvez écrire
et le nom de fichier devrait être partagée à tous les "-", ".", ";", "l", "d" ou "7". À l'intérieur des classes de caractères, le "." n'est pas un caractère spécial ("caractère de remplacement").
je ne vois que des solutions mais aucune explication complète du problème, j'ai donc décidé de poster cette réponse
Problème
Vous avez besoin de savoir quelques petites choses sur
text.split(delim)
.split
méthode:delim
existe à la fin de l'text
comme dansa,b,c,,
(où le séparateur est,
)split
d'abord se créer une matrice comme["a" "b" "c" "" ""]
mais étant donné que dans la plupart des cas, nous n'avons pas vraiment besoin de ces traînant des chaînes vides il supprime également automatiquement pour nous. De sorte qu'il crée un autre tableau sans ces traînant des chaînes vides et le renvoie.Vous devez également savoir que dot
.
est caractère spécial dans regex. Il représente n'importe quel caractère (à l'exception de la ligne de séparateurs, mais cela peut être modifié avecPattern.DOTALL
drapeau).Donc pour la chaîne
"abc"
si nous nous sommes répartis en"."
split
méthode["" "" "" ""]
,qui signifie que nous allons obtenir comme résultat un tableau vide
[]
(avec n éléments, même pas la chaîne vide), donc on ne peut pas utiliserfn[0]
car il n'y a pas d'indice 0.Solution
Pour résoudre ce problème il vous suffit de créer regex qui représente point. Pour ce faire, nous avons besoin d'échapper à ce
.
. Il ya quelques façons de le faire, mais la plus simple est probablement en utilisant\
(qui, dans la Chaîne de caractères doit être écrit"\\"
parce que\
est aussi spécial et il a besoin d'un autre\
être échappé).Donc la solution à votre problème peut ressembler à
Bonus
Vous pouvez également utiliser d'autres moyens d'échapper à ce point comme
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
drapeausplit(Pattern.quote("."))
et laissez regex ne s'échapper pour vous.DOT( . ) est considéré comme un caractère spécial et de la méthode de fractionnement de la Chaîne s'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 depuis "\" est aussi un caractère spécial en Java, vous devez vous échapper de nouveau avec un autre "\" !
Ne serait-il pas plus efficace d'utiliser
si vous voulez seulement ce qui est du premier point?
Est généralement PAS une bonne idée de la démasquer par la main. Il y a une méthode dans le Modèle de classe pour cette tâche:
La scission doit être prise regex comme un argument... il suffit de changer
"."
à"\\."
Note: d'Autres le soin devrait être pris avec cet extrait de code, même après que le point est échappé!
Si le nom de fichier est simplement la chaîne de caractères ".", alors fn va encore se retrouver à être de longueur 0 et fn[0] va encore lever une exception!
C'est, parce que si le modèle correspond au moins une fois, puis séparation de jeter tous fuite des chaînes vides (donc aussi celui avant le point!) à partir de la matrice, laissant un tableau vide pour être retourné.
split
prend une regex comme argument. Donc, vous devriez passer"\."
au lieu de"."
parce que"."
est un caractère de remplacement dans la regex.