2012-04-10 49 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(); 
} 
} 

所以這是我的代碼。我試圖找出一個由2個字母和一個數字組成的模式。爲什麼我從getNextData()函數中得不到任何空數組?我的模式有什麼問題?

+0

你可以發佈你的文件「mydata.txt」或片段? – dash1e 2012-04-10 01:03:40

+0

'mydata.txt'裏有什麼?可以訪問嗎?嘗試將其替換爲文件的絕對路徑,以查看它是否是文件路徑問題(不要忘記在Windows上將斜槓加倍)。 – dasblinkenlight 2012-04-10 01:03:42

+0

該文件與src文件夾位於相同的位置。那不會有什麼大不了的? – user1281598 2012-04-10 01:37:17

回答

1

Scanner.hasNext(pattern)搜索在分隔符之間開始的模式。在你的情況下,分隔符是|。但掃描儀的默認分隔符是空格。您必須手動將您的分隔符更改爲|或完全忽略分隔符。下面是使用Scanner.findWithinHorizon一個例子,它並不關心分隔符:

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

我修改了它來說明要分開的字符,但是是的。謝謝。爲什麼你認爲hasNext()在這種情況下不起作用? – user1281598 2012-04-10 02:17:20

+0

添加了關於hasNext()的解釋。 – 2012-04-10 02:25:40

+0

謝謝。這有一點幫助。 – user1281598 2012-04-10 02:37:53

1

在表達式:

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

reader.next(pattern)返回了圖案的下一次出現,例如「AB123」。

pattern.split然後將該字符串分割到模式周圍,並在其兩側返回文本。當然,因爲分隔符「AB123」是整個字符串,所以在任一側上都有沒有文本。

你想只返回字符串「AB123」?在這種情況下,您可能只需返回reader.next的結果。

+0

所以我只需要將它自己分開? – user1281598 2012-04-10 01:22:50

+0

而我仍然一無所獲。它找不到任何數據。 – user1281598 2012-04-10 01:41:54

+1

問題是:你爲什麼要返回一個String數組?你期望在字符串數組中有什麼?它應該只是一個包含字符串「AB123」的元素嗎?如果是這樣,爲什麼不讓getNextData方法返回一個String? – 2012-04-10 01:42:32

0

我認爲你的正則表達式是有缺陷的。我相信你想要

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