2009-08-03 3 views
1

Ich muss bestimmte Dinge aus Zeilen eines Eingabetexts anpassen. Die Zeilen sehen so aus:Problem mit passendem Token in einer Zeile, Scanner in Java verwenden

to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 

Ich benutze die Scanner-Klasse, um jede Zeile des Textes zu lesen, und ich habe den folgenden Code geschrieben. Allerdings funktioniert etwas nicht richtig, weil das Muster "to" nicht mit der Linie übereinstimmt, und das sollte auch so sein, weil "to" in der Zeile enthalten ist (ich habe versucht, nicht nur "to" von der Zeile abzugleichen), aber nichts paßt):

Scanner scanner = new Scanner(file); 
while(scanner.hasNext()) { 
     String line = scanner.nextLine(); 
     System.out.println("line: " + line); 
     Pattern p_pos = Pattern.compile("to"); 
     Matcher m_pos = p_pos.matcher(line); 
     String match = m_pos.group(0); 
     System.out.println("match: " + match); 
     boolean b_pos = m_pos.matches(); 
     if(b_pos) { 
      System.out.println(match); 
     } 
} 

Ausgang:

line: to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 
Exception in thread "main" java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:485) 
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31) 
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17) 

ich habe noch eine Frage: wie kann ich die Linie verarbeiten, so dass ich alles von Anfang an der Linie zu speichern, bis die ersten „/“ Symbol? Ich konnte keine Methode dafür in der API finden. Ist es möglich? Ich möchte im Grunde nacheinander durch die Linie gehen, Stücke der Linie in verschiedenen Variablen speichern und dann die Werte dieser Variablen verwenden. Da ich nicht weiß, wie viele Token ich vor dem ersten "/" Symbol habe, kann ich next() nicht beliebig oft verwenden.

Vielen Dank im Voraus.

Antwort

1

.matches() versucht, die gesamte Eingabezeichenfolge übereinzustimmen. Verwenden Sie .find(), wenn Sie einen Teil der Eingabezeichenfolge abgleichen möchten, oder .lookingAt(), wenn Sie den Anfang der Eingabezeichenfolge abgleichen möchten.

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

Auch, wenn Sie Ihr Muster erweitern Gruppen mit passenden (siehe allgemeiner regex Referenz für weitere Details, wie passende Gruppen arbeiten), können Sie die .group() Funktion nach einem erfolgreichen Spiel können den Teil abrufen durch eine bestimmte Gruppe innerhalb des Musters abgestimmt.

1

Sie könnten den Teil, den Sie für die Token müssen extrahieren, indem Sie:

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1); 

und dann Schleifen über, dass die Token zu extrahieren

Pattern.compile("\\w+").matcher(tokenSection).find(); 

mit Offensichtlich würden Sie die oben nicht stecken Teile des Codes direkt in.