2012-04-10 6 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()関数から空の配列が得られないのですか?私のパターンに何が問題なのですか?

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

reader.next(pattern)は、例えば、そのパターンの次の発生を返している:式中

+0

あなたは「mydata.txtという」またはフラグメントを提出投稿することができますか? – dash1e

+0

'mydata.txt'には何がありますか? Isはアクセス可能ですか?ファイルの絶対パスで置き換えて、ファイルパスの問題かどうか確認してください(Windowsではスラッシュを倍にすることを忘れないでください)。 – dasblinkenlight

+0

ファイルはsrcフォルダと同じ場所にあります。それは大したことではないでしょうか? – user1281598

答えて

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

+0

hasNext()が何をするかについての説明が追加されました。 –

+0

ありがとうございます。それは少し助けます。 – user1281598

1

"AB123"。

しかし、pattern.splitは、その文字列をパターンの周りに分割し、その両側のテキストを返します。区切り文字「AB123」は文字列全体であるため、当然、どちらの側にもテキストがあります。

文字列 "AB123"を返すだけですか?その場合はおそらくreader.nextの結果を返すことができます。

+0

私はそれを自分自身に分けなければならないのですか? – user1281598

+0

私はまだ何も得ていません。データが見つかりません。 – user1281598

+1

問題は、なぜ文字列配列を返すのですか?あなたはその文字配列に何を期待していますか?それは文字列 "AB123"を含む要素の1つではないでしょうか?もしそうなら、あなたのメソッドgetNextDataにStringを返すのはいかがですか? –

0

あなたの正規表現には欠陥があると思います。私はあなたが望むと信じます

private Pattern pattern = Pattern.compile("\\w{2}\\d"); 
関連する問題