2012-04-10 48 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");