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

在表达式中:

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

reader.next(pattern)正在返回该模式的下一次出现,例如“AB123”。

pattern.split随后将围绕模式拆分该字符串,并在其两侧返回文本。自然,两边都没有文本,因为分隔符“AB123”是整个字符串。

你想只返回字符串 "AB123" 吗?reader.next在这种情况下,您可能只返回结果。

于 2012-04-10T01:05:28.667 回答
1

Scanner.hasNext(pattern)搜索在分隔符之间开始的模式。在您的情况下,分隔符是|. 但是 Scanner 的默认分隔符是空格。您必须手动将定界符更改为 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 回答
0

我认为你的正则表达式有缺陷。我相信你想要

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