有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的模式有什么问题?

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();
}
}

这是我的代码。我试图找出一个由两个字母和一个数字组成的图案。为什么我从getNextData()函数中没有得到任何东西/空数组


共 (3) 个答案

  1. # 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();
    
        }
    }
    
  2. # 2 楼答案

    在表达式中:

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

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

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

    是否只返回字符串“AB123”?在这种情况下,您可能只需返回reader.next的结果

  3. # 3 楼答案

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

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