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() 関数から何も取得しない/空の配列を取得するのはなぜですか?

4

3 に答える 3

1

Scanner.hasNext(pattern)区切り文字の間で始まるパターンを検索します。あなたの場合、区切り文字は|. ただし、スキャナーのデフォルトの区切り文字は空白です。デリミタを a に手動で変更するか|、デリミタを完全に無視する必要があります。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();

    }
}
于 2012-04-10T01:58:55.620 に答える
1

式では:

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

reader.next(pattern)「AB123」など、そのパターンの次の出現を返します。

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

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

于 2012-04-10T01:05:28.667 に答える
0

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

private Pattern pattern = Pattern.compile("\\w{2}\\d");
于 2012-04-10T01:20:53.863 に答える