Trennzeichen in Scanner Java Verwirrung
Laut Java-API-Scanner verwendet Trennzeichen zu brechen, die die gesamte input in tokens. Ich bin versucht, zu verstehen, die Token und Trennzeichen. Ich habe das Programm und drücken Sie eine Verwirrung
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s = null;
try {
s = new Scanner(System.in);
s.useDelimiter("A");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
}
}
Wenn ich den Eingang AAAAAasdf
ich bekomme die folgende Ausgabe.
1 0
2 0
3 0
4 0
Kann ich verstehen diese Ausgabe als die Länge des tokens ist null zwischen den Trennzeichen daher werden alle gleich null sind, aber wenn ich den default-Trennzeichen und geben Sie die Eingabe als
_____aaa\n
->Ersetzen Sie den Unterstrich durch ein Leerzeichen und \n
von mir zu schlagen, geben Sie in der eclipse-Konsole.
Dafür bin ich immer die Ausgabe als
1 3
den ich nicht verstehen kann. Ich habe 5 Räume, es sind also 4 Token von 0 Längen zwischen Ihnen. Warum nicht? Was vermisse ich hier?
- ich würde davon ausgehen, scanner überspringt die Räume
- Es arbeitet nach regex-Muster. Siehe die meisten von Ihnen positiv bewertet werden Antwort und API-Referenz in den Kommentar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
useDelimiter nimmt einen regulären Ausdruck Muster. Die Standard-Muster ist
Die passt auf jede beliebige Menge von zusammenhängenden Leerzeichen. Möchten Sie das Trennzeichen, für eine beliebige Menge von zusammenhängenden versuchen so etwas wie
Lesen Sie diese: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String)
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#reset()
WHITESPACE_PATTERN
und du wirst sehen die Erklärung in dieser Antwort. hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/...Es ist wirklich interessant zu sehen, dass, wenn wir angeben, "" (Leerzeichen) als Trennzeichen im code
und die Eingabe ist
sehen wir die Ausgabe
Aber wenn wir dont geben Sie das Trennzeichen an,
Den gleichen Eingang
erzeugt eine andere Ausgabe
So, ich denke, dass die Angabe der Trennzeichen, obwohl die default-macht der scanner alle überspringen leerer Token.
Scanner.next()
- Funktion Findet und liefert die nächste vollständige token von diesem scanner. Eine komplette token vorangestellt und gefolgt von der Eingabe entspricht, diedelimiter pattern
. Die Standard-Muster ist\\p{javaWhitespace}+
.Um es besser zu verstehen, versuchen etting Trennzeichen
"\\s*"
:Für eine Eingabe
123
esscanner.next()
drucken:Als
X*
sagt, dass MusterX
auftreten können null oder mehrere Male. Dieser Ausdruck ist bekannt als Quantoren. Jedoch ein AusdruckX+
sagt, dassX, one or more times
. So versuchen Sie mit Trennzeichen"[A]+"
die sagt, dass"A"
tritt eines oder mehrere der Zeit, und vergleicht jede Menge von zusammenhängenden"A"