2009-10-31 2 views
4

Je suis en train d'obtenir l'extension d'un nom de fichier, mais pour une raison que je ne peut pas faire le travail partagé:Pourquoi ce split() échoue-t-il?

System.out.println(file.getName()); //gNVkN.png 
System.out.println(file.getName().split(".").length); //0 

Qu'est-ce que je fais mal?

Répondre

20

split() prend une expression régulière, pas une chaîne de séparation à diviser par. L'expression régulière "." signifie "un seul caractère", de sorte qu'il se divisera sur tout. Pour diviser une utilisation de points littérale:

file.getName().split("\\.") 
+1

En général, vous pouvez utiliser Pattern.quote (str) pour obtenir une expression régulière qui correspond 'str' littéralement. – Ramon

+1

Bonne réponse, merci! – etheros

+0

Est-ce que quelqu'un a dit ** Regex **: D http://xkcd.com/208/ –

5

Peut-être que vous devriez relire l'api-doc pour split(java.lang.String)

La chaîne que vous passez est un regex.

Essayez d'utiliser

split("\\.") 

Vous devez la double barre oblique inverse parce que \. est une évasion invalide dans un Java-chaîne. Donc, vous devez échapper à la barre oblique inverse dans le javastring.

4

String.split() demande une expression régulière dans son paramètre, et dans les expressions régulières, . correspondra à n'importe quel caractère. Pour le faire fonctionner, vous devez ajouter un \, comme ceci:

System.out.println(file.getName().split("\\.").length); 

Vous avez besoin d'un anti-slash pour échapper à la dot, de sorte que le regex sait que vous voulez un point réel. Vous avez besoin de l'autre barre oblique inverse pour échapper à la première barre oblique inverse, c'est-à-dire pour dire à Java que vous voulez avoir un backslash réel dans votre chaîne. Lire le javadoc pour String.split et regular expressions pour plus d'informations