2017-10-12 3 views
4

Quelqu'un peut-il me dire pourquoi cela fonctionne bien:Comment scinder " n" de l'entrée de l'utilisateur?

String wanttosplit = "asdf...23\n..asd12"; 
String[] i = wanttosplit.split("\n"); 
output are: 
i[0] = asdf...23 
i[1] = ..asd12 

Quand je veux obtenir les données de l'utilisateur comme:

import java.util.Scanner; 
Scanner scan = new Scanner(System.in); 
String wanttosplit = scan.next(); //user enter asdf...23\n..asd12 on the  keyboard 
String[] i = wanttosplit.split("\n"); 
output are: 
i[0] = asdf...23\n..asd12 

Pourquoi na pas divisé comme dans le premier exemple?

+0

Avez-vous essayé split ("\ n \ r")? – sai

+0

Avez-vous essayé split ("\\ n")? – GregaMohorko

Répondre

6

La différence est que dans le \nString littéral "asdf...23\n..asd12" est traité par le compilateur Java, tandis que l'entrée d'utilisateur est tel que asdf...23\n..asd12-est transmis à Scanner.

Le compilateur Java remplace une séquence d'échappement \n avec le caractère de saut de ligne (LF), qui correspond au point de code 10 dans UNICODE. D'autre part, Scanner, vous passe deux caractères distincts, '\' et 'n', donc lorsque vous passez la chaîne à la méthode split, il ne trouve pas de séparateur de point de code LF.

Vous devez traiter la séquence d'échappement \n vous, par exemple, en passant split une expression régulière qui le reconnaît:

String[] i = wanttosplit.split("(?<!\\\\)\\\\n"); 

Demo.

0

Dans votre deuxième exemple, la chaîne saisie par l'utilisateur contient un backslash suivi de la lettre n, mais le paramètre passé à wanttosplit.split() est une chaîne de caractères unique contenant le caractère de retour à la ligne.

Dans le premier exemple wanttosplit contient un caractère de nouvelle ligne (parce que le compilateur java a remplacé le modèle « \ n » avec un caractère unique représentant newline.

0

Pour diviser aat l'entrée utilisateur \n vous devez diviser à \\n parce que Java choisira \n comme un caractère de nouvelle ligne. , si elles sont vous ajoutez un autre \ infront de \n Java échapper à la nouvelle ligne caractères et divise la place au texte actuel \n

0

on dirait que vous entrez littéralement « \ » et ' n 'via la console? Le scanner n'esacpe pas cette séquence et la prend plutôt telle quelle.

Lors de l'obtention d'entrée du scanner vous pouvez aussi ne pas besoin de diviser les lignes, parce que Scanner vous donne toujours une ligne lors de l'exécution suivante()

Si vous voulez lire dans plusieurs lignes de l'utilisateur que vous devez appeler next() plusieurs fois.