2010-03-05 11 views
8

Dies ist wahrscheinlich ein Quicky. Warum gibt dieser Code nichts zurück?Java: Abtaststring für ein Muster

import java.util.Scanner; 

public class MainClass { 

public static void main(String[] args) { 
    try { 

     Scanner sc = new Scanner("asda ASA adad"); 
     String pattern = "[A-Z]+"; 

     while ((sc.hasNext(pattern))) { 

      System.out.println(sc.next(pattern)); 
     } 
     sc.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

Antwort

15

hasNext(String pattern) liefert nur true wenn das nächste Token dem Muster übereinstimmt. In Ihrem Fall ist "asda" das nächste Token, und das entspricht NICHT "[A-Z]+". Die Dokumentation ist dadurch klar, dass "der Scanner keine Eingabe vornimmt".

Wenn Sie das Muster in "[A-Za-z]+" ändern, erhalten Sie drei Token, die möglicherweise Ihren Vorstellungen entsprechen.

Wenn Sie in der Tat nur Token zu bekommen, die "[A-Z]+" übereinstimmen, dann können Sie eine der folgenden Aktionen:

  • einfach nicht passende Token
  • useDelimiter("[^A-Z]+"), verwerfen dann einfach aufrufen next()
  • verwenden skip("[^A-Z]+")
  • Verwendung findInLine("[A-Z]+")

Tipp: Wenn die Leistung kritisch ist, sollten Sie die vorkompilierten Pattern Überladungen dieser Methoden verwenden.

Tipp: Denken Sie daran, dass "Xooo ABC" zwei "[A-Z]+" Übereinstimmungen hat. Wenn dies nicht das ist, was Sie wollen, dann muss die Regex ein bisschen komplizierter sein. Oder Sie können immer einfach nicht passende Token einfach verwerfen.

0

ändern

String pattern = "[A-Z]+"; 

zu

String pattern = "[a-zA-Z]+"; 
0

Wenn Sie alle Wörter von Ihrem Trennzeichen umgeben auszudrucken suchen Sie sicher sein wollen könnte, und das Muster ganz auszuschließen. Auf diese Weise stoßen Sie nicht auf ein Wort, das ein Zeichen enthält, das nicht in Ihrem Muster enthalten ist, was dazu führen würde, dass Ihr Programm diese Schleife beendet (wie es gerade geschieht). Zum Beispiel:

while ((sc.hasNext())) { 

     System.out.println(sc.next()); 
    }