web-dev-qa-db-fra.com

Fractionner la chaîne avec le point comme séparateur

Je me demande si je vais diviser une chaîne sur un . correctement. 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 . signifie n'importe quel caractère, alors maintenant je suis bloqué.

84
Dean

split() accepte une expression régulière, vous devez donc quitter . pour ne pas la considérer comme un méta-caractère regex. Voici un exemple:

String[] fn = filename.split("\\."); 
return fn[0];
152
Marimuthu Madasamy

Split utilise des expressions régulières, où '.' est un caractère spécial qui signifie n'importe quoi. Vous devez y échapper si vous voulez réellement que cela corresponde au "." personnage:

String[] fn = filename.split("\\.");

(un '\' pour échapper au '.' dans l'expression régulière et l'autre pour échapper au premier dans la chaîne Java)

De plus, je ne recommanderais pas de renvoyer fn [0], car si vous avez un fichier nommé something.blabla.txt, qui est un nom valide, vous ne retournerez pas le nom de fichier actuel. Au lieu de cela, je pense que c'est mieux si vous utilisez:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
16

la méthode String # split (String) utilise des expressions rationnelles . Dans les expressions rationnelles, le "." caractère signifie "n'importe quel caractère" . Vous pouvez éviter ce comportement en échappant soit à "."

filename.split("\\.");

ou dire à la méthode de scission de scinder à une classe de personnage:

filename.split("[.]");

Les classes de caractères sont des collections de caractères. Tu pourrais écrire

filename.split("[-.;ld7]");

et le nom du fichier serait divisé à chaque "-", ".", ";", "l", "d" ou "7". Dans les classes de caractères, le "." n'est pas un caractère spécial ("métacaractère").

14
f1sh

Je ne vois que des solutions ici mais aucune explication complète du problème alors j'ai décidé de poster cette réponse

Problème

Vous devez connaître peu de choses sur text.split(delim). split méthode:

  1. accepte comme argument expression régulière (regex) qui décrit le délimiteur sur lequel nous voulons scinder, 
  2. si delim existe à la fin de text comme dans a,b,c,, (où le délimiteur est ,) split créera un tableau comme ["a" "b" "c" "" ""] mais dans la plupart des cas, nous n'avons pas vraiment besoin de ces chaînes vides de fin, il les supprime également automatiquement. Donc, il crée un autre tableau sans ces chaînes vides et le renvoie.

Vous devez également savoir que point . est caractère spécial in regex​​_. Il représente n'importe quel caractère (sauf les séparateurs de lignes, mais cela peut être modifié avec l'indicateur Pattern.DOTALL).

Donc, pour une chaîne comme "abc" si nous nous séparons sur la méthode "."split 

  1. créer un tableau comme ["" "" "" ""]
  2. mais comme ce tableau ne contient que des chaînes vides et qu'elles sont toutes en fin de chaîne, elles seront supprimées (comme indiqué dans le deuxième point précédent) 

ce qui signifie que nous obtiendrons comme résultat un tableau vide [] (sans élément ni même chaîne vide), nous ne pouvons donc pas utiliser fn[0] car il n'y a pas d'index 0.

Solution

Pour résoudre ce problème, vous devez simplement créer une regex qui représente un point. Pour ce faire, nous devons échapper à ce .. Il y a peu de façons de le faire, mais la plus simple consiste probablement à utiliser \ (qui dans String doit être écrit en tant que "\\" car \ est également spécial et nécessite un autre \ pour être échappé).

Donc, la solution à votre problème peut ressembler à

String[] fn = filename.split("\\.");

Prime

Vous pouvez également utiliser d'autres moyens pour échapper à ce point, comme 

  • en utilisant la classe de caractères split("[.]")
  • en l’emballant dans quotesplit("\\Q.\\E")
  • en utilisant l'instance de modèle appropriée avec l'indicateur Pattern.LITERAL
  • ou utilisez simplement split(Pattern.quote(".")) et laissez regex s’échapper pour vous.
11
Pshemo

Comme DOT (.) Est considéré comme un caractère spécial et que la méthode de division de String attend une expression rationnelle similaire à celle requise - 

String[] fn = filename.split("\\.");
return fn[0];

En Java, les caractères spéciaux doivent être échappés avec un "\", mais comme "\" est aussi un caractère spécial en Java, vous devez le remplacer avec un autre "\"!

6
Neel

Ne serait-il pas plus efficace d'utiliser

 filename.substring(0, filename.indexOf("."))

si vous voulez seulement ce qui se passe jusqu'au premier point?

2
Martin Smith

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:

Java.util.regex
static String quote(String s) 
2
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
2
Magnus Persson

La scission doit prendre regex comme argument ... Changez simplement "." en "\\."

1
Bob Fincheimer

Remarque: cet extrait doit faire l'objet de précautions même après l'échappement du point!

Si le nom de fichier est juste la chaîne ".", Alors fn aura toujours une longueur de 0 et fn [0] lève toujours une exception!

En effet, si le modèle correspond au moins une fois, alors split sera éliminera toutes les chaînes vides après (donc aussi celle avant le point!) Du tableau, laissant un tableau vide à revenu.

0
avl42