2012-04-10 5 views
1
public class FileParser { 

private String filename = "mydata.txt"; 
private Pattern pattern = Pattern.compile("\\D\\D\\d+"); 
private Scanner reader; 

public FileParser() throws FileNotFoundException{ 
    reader = new Scanner(new File(filename)); 
} 

public boolean hasMoreData(){ 
    return reader.hasNext(pattern); 
} 

public String[] getNextData(){ 

    return pattern.split(reader.next(pattern)); 
} 

public void close(){ 
    reader.close(); 
} 
} 

Das ist also mein Code. Ich versuche ein Muster aus 2 Buchstaben und einer Zahl herauszunehmen. Warum bekomme ich nichts/ein leeres Array von der Funktion getNextData()?Was stimmt nicht mit meinem Muster?

+0

Können Sie nach Ihnen „mydata.txt“ oder ein Fragment-Datei? – dash1e

+0

Was ist in 'mydata.txt'? Ist zugänglich? Versuchen Sie es durch einen absoluten Pfad zu der Datei zu ersetzen, um zu sehen, ob es sich um ein Dateipfadproblem handelt (vergessen Sie nicht, Ihre Schrägstriche unter Windows zu verdoppeln). – dasblinkenlight

+0

Die Datei befindet sich nur an der gleichen Stelle wie der Ordner src. Das wird nicht so eine große Sache, oder? – user1281598

Antwort

1

Scanner.hasNext(pattern) sucht nach dem Muster, das zwischen dem Trennzeichen beginnt. In Ihrem Fall ist das Trennzeichen eine |. Das Standardtrennzeichen des Scanners ist jedoch Leerzeichen. Sie müssen entweder Ihr Trennzeichen manuell auf | setzen oder das Trennzeichen vollständig ignorieren. Hier ist ein Beispiel unter Verwendung von Scanner.findWithinHorizon, die kümmert sich nicht um das Trennzeichen:

public class FileParserExample { 
    private Pattern pattern = Pattern.compile("([a-zA-Z]{2})(\\d+)"); 
    private Scanner reader; 


    public FileParserExample(String filename) throws FileNotFoundException { 
     reader = new Scanner(new File(filename)); 
    } 

    public boolean hasMoreData() { 
     String textFound = reader.findWithinHorizon(pattern, 0); 
     return textFound != null; 
    } 

    public String[] getNextData() { 
     MatchResult match = reader.match(); 
     String [] pieces = {match.group(1), // AB 
          match.group(2) }; // 123 
     return pieces; 
    } 

    public void close() { 
     reader.close(); 
    } 

    public static void main(String[] args) throws FileNotFoundException { 
     String filename = "mydata.txt"; 
     FileParserExample parser = new FileParserExample(filename); 

     while (parser.hasMoreData()) { 
      System.out.println(Arrays.toString(parser.getNextData())); 
     } 

     parser.close(); 

    } 
} 
+0

Ich habe es so geändert, dass die Zeichen getrennt sind, aber das tut es. Vielen Dank. Warum glauben Sie, dass hasNext() in diesem Fall nicht funktioniert? – user1281598

+0

Eine Erläuterung hinzugefügt, was hasNext() bewirkt. –

+0

Danke. Das hilft ein bisschen. – user1281598

1

In dem Ausdruck:

pattern.split(reader.next(pattern)); 

reader.next(pattern) wird das nächste Auftreten dieses Musters zurückkehrt, z.B. "AB123".

Aber pattern.split teilt dann diese Zeichenfolge um das Muster und gibt den Text auf jeder Seite davon zurück. Natürlich gibt es keine Text auf beiden Seiten, weil das Trennzeichen "AB123" die ganze Zeichenfolge ist.

Möchten Sie nur die Zeichenfolge "AB123" zurückgeben? Sie könnten in diesem Fall wahrscheinlich nur das Ergebnis reader.next zurückgeben.

+0

Also muss ich es einfach aufteilen? – user1281598

+0

Und ich bekomme immer noch nichts. Es kann keine Daten finden. – user1281598

+1

Die Frage ist: Warum geben Sie ein String-Array zurück? Was erwarten Sie in diesem String-Array? Soll es genau ein Element sein, das die Zeichenfolge "AB123" enthält? Wenn ja, warum liefert Ihre Methode getNextData nicht stattdessen einen String? –

0

Ich denke, Ihre Regex ist fehlerhaft. Ich glaube, du willst

private Pattern pattern = Pattern.compile("\\w{2}\\d");