【问题标题】:What is wrong with my pattern?我的模式有什么问题?
【发布时间】:2012-04-10 00:59:55
【问题描述】:
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() 函数中什么都得不到/一个空数组?

【问题讨论】:

  • 你能发布你的文件“mydata.txt”或片段吗?
  • mydata.txt 中有什么内容?是可访问的吗?尝试用文件的绝对路径替换它,看看它是否是文件路径问题(不要忘记在 Windows 上加倍斜杠)。
  • 该文件与 src 文件夹位于同一位置。这没什么大不了的吧?
  • 数据模式看起来像AZ123;字符,字符,整数。
  • 我应该只使用扫描仪的下一个带有分隔符的条形符号 |对吧?

标签: java regex pattern-matching


【解决方案1】:

Scanner.hasNext(pattern) 搜索在分隔符之间开始的模式。在您的情况下,分隔符是|。但是 Scanner 的默认分隔符是空格。您必须手动将分隔符更改为 | 或完全忽略分隔符。下面是一个使用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();

    }
}

【讨论】:

  • 我对其进行了修改以将字符分开,但确实如此。谢谢你。为什么你认为 hasNext() 在这种情况下不起作用?
  • 添加了关于 hasNext() 作用的解释。
【解决方案2】:

在表达式中:

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

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

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

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

【讨论】:

  • 所以我只需要自己拆分?
  • 我仍然一无所获。它找不到任何数据。
  • 问题是:你为什么要返回一个字符串数组?你期望在那个字符串数组中是什么?它是否应该恰好是包含字符串“AB123”的一个元素?如果是这样,为什么不让你的方法 getNextData 返回一个字符串呢?
  • 还有:mydata.txt 中的数据是什么样的? mydata.txt 中是否有空格?
  • 我想分割数据。我想也许 split 会为我做到这一点。我希望它被两个字符和 int 分开。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2017-02-17
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多