2012-04-08 8 views
2

Ich versuche, Java-Scanner mit dem folgenden Satz von Trennzeichen & = ~ ^ (Et-Zeichen, equals, Tilde, Caret) mit Methode useDelimiter("&|=|~|^"); zu verwenden.Java-Scanner ignoriert^Caret

Alle Trennzeichen funktionieren OK abgesehen von ^, die ignoriert wird: warum ist das?

Ich kann nicht sehen, warum in der Scanner-Dokumentation.

+0

Das "Squiggle" heißt "Tilde" (~) http://en.wikipedia.org/wiki/Tilde –

+0

Ich dachte so ... dachte gerade nicht, dass ich Tilde richtig buchstabieren konnte, obwohl – Hector

Antwort

3

Sie müssen entkommen ^, so: useDelimiter("&|=|~|\\^"). Das liegt daran, dass ^ ein Metazeichen in regulären Ausdrücken ist und der String-Parameter von useDelimiter() schließlich in eine Regex Pattern kompiliert wird.

Gleichwertig, könnten Sie das Trennzeichen wie folgt schreiben, in diesem Fall gibt es keine Notwendigkeit zu entkommen die ^: useDelimiter("[&=~^]")

+0

ich dieses bereits probiert hatte Ansatz und es hat nicht funktioniert ... aber ich denke, das ist, weil das^unmittelbar gefolgt wurde von =. Ich glaube, wenn zwei Delimeter aufeinander folgen, dann funktioniert die Verwendung einer Liste von einzelnen Delimetern nicht ... oder vielleicht zwei Delimeters nebeneinander enden mit Null in dem Token – Hector

+0

In einer Zeichenklasse (die Sache umgeben von '[]' in einem regulären Ausdruck) bedeutet ein '^' die Negation, wenn sie am Anfang gefunden wird. Zum Beispiel bedeutet dies "[^ abc]": passe alles an _but_ a oder b oder c. Wenn das Caret an einer anderen Position in einer Zeichenklasse erscheint, wird es als normales Zeichen interpretiert –

2

^ ein reserviertes Symbol in regulärer Ausdruck ist, so müssen Sie es entkommen: \\^.

1

Statt einen Wechsel der Verwendung können Sie ein character class verwenden:

"[&=~^]" 

Da ^ innerhalb einer Zeichenklasse nicht speziell ist (außer am Start) ist es nicht entkommen muss.