2009-08-16 3 views
1

Ich habe einen regulären Ausdruck erstellt, den ich zu einem Muster kompiliere, um Fortran Real * 8 Zahlen zu finden. Der schwierige Bit ist, dass die Datei aus lese ich eine einzige Zeile mit ein paar Millionen Spalten ist .. Wenn ich dies tun:Probleme mit/Confused von Java.util.Scanners nächste (Muster) -Methode

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.findInLine(real8Regex); 

ich bekommen, was ich suche, aber wenn ich die Verwendung nächste (Muster) -Methode, bekomme ich eine InputMismatchException .. Seltsam, sowohl findInLine und nächsten Return-Strings.

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.next(real8Regex); 

Fehle ich etwas Entscheidendes in der Verwendung der nächsten() Methode?

Antwort

3

Ist es ein "nicht alle Tokens entsprechen dem Muster und damit next(Pattern) bleibt bei der ersten nicht übereinstimmenden Token" Problem?

String toSearch = "ab123d4e::g67f912g34h"; 
Scanner aScanner = new Scanner(toSearch); 
aScanner.useDelimiter("[a-z]+"); 
while (aScanner.hasNext("[0-9]+")) 
{ 
    System.out.println(aScanner.next("[0-9]+")); 
} 

aber nur Ausgang 123 und 4 als nicht-passende dritte Token bewirkt, daß die while Schleife zu beenden:

next(Pattern) könnte wie folgt verwendet werden. In diesem Szenario sollte ich jedoch stattdessen hasNext() und next() verwenden.

Ich habe Mühe, über einen wirklichen Grund zu denken, jemals next(Pattern) zu verwenden, weil es bei dem ersten Token hängen bleibt, das nicht mit dem Muster übereinstimmt. next(Pattern) bedeutet nicht bedeuten "zurück das erste Token nach der aktuellen Position, die Muster entspricht"; es bedeutet, „in der Folge das nächste Token zurück, wenn es Muster übereinstimmt, sonst nichts tun“

Sie (vermutlich) müssen so alle Token lesen in wäre besser hasNext() und next() zu verwenden und dann eine Matcher verwenden gegen die erforderliche Pattern für jedes Token

Schließlich können Sie finden question 842496 nützlich

2

Es scheint mir, dass die Dokumentation nicht brillant geschrieben ist, aber es tut, was es bedeutet.

next(pattern) wird dokumentiert, um das Token zurückzugeben, wenn es an der aktuellen Position des Scanners gefunden wird. findInLine(pattern) wird dokumentiert, um null zurückzugeben, wenn das Muster innerhalb der aktuellen Zeile nicht übereinstimmt.

Um dies zuerst zu überprüfen, verwenden Sie hasNext(pattern), bevor Sie next(pattern) anrufen.

+0

Danke für die Antwort, wWenn ich es mit hasNext (Pattern) versucht habe, findet die App nichts ... Wenn ich das if (hasNext (Pattern)) mit einer While-Schleife für Scanner bedingte.hasNext() (was einfach wahr ist, wenn es ein anderes Token gibt, das auf meinem Delimiter basiert, der Leerzeichen ist), frisst der Code nur CPU-Zyklen, aber gibt niemals Ergebnisse zurück. – sbook

+1

Ja, weil hasNext den Scanner nicht weiterbringt. Es ist mir nicht klar, was Sie wirklich erreichen wollen. Ein Beispielcode würde helfen. –

1

ich bin ein wenig spät (Sie sollten es „regex“ markiert), aber Sie sollten

String foundReal = recordScanner.findWithinHorizon(real8Regex, 0); 
werden unter Verwendung

Mit findInline(real8Regex) machen Sie den Scanner viele unnötige Verarbeitung, um sicherzustellen, dass die aktuelle Übereinstimmung in der gleichen Zeile wie die letzte ist. Die Tatsache, dass Ihre Daten alle in einer Zeile sind, ist genau der Grund, warum Sie nichtfindInLine() verwenden sollten.