【问题标题】:How to pass a file into Java Matcher?如何将文件传递到 Java Matcher?
【发布时间】:2017-11-30 15:24:33
【问题描述】:

我有一个使用 Java Matcher 的简单方法

public int countWord(String word, File file) throws FileNotFoundException {

    String patternString = word;
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(file);

    int count = 0;
    while (matcher.find()) {
        count++;
        System.out.println("found: " + count + " : "
                + matcher.start() + " - " + matcher.end());
    }
    return  count;
}

我的想法是将文件传递到指令中:

Matcher matcher = pattern.matcher(file);

Java 抱怨它,即使我遵循 IDE 的建议,说要进行这样的演员:

java.util.regex.Matcher matcher = pattern.matcher((CharSequence) file);

事实上,当我尝试启动编译时,它会报告此消息:

Exception in thread "main" java.lang.ClassCastException: java.io.File cannot be cast to java.lang.CharSequence

我怎样才能越过这个障碍?

【问题讨论】:

  • 你到底想做什么,检查文件名是否匹配模式,或者匹配文件的内容? 1:做file.getName(),2:这要复杂得多,您必须打开并读取文件并匹配文件的内容 - 匹配器不会自动为您执行此操作。
  • 显然,文件不是字符序列。您必须先读取文件,然后将其转换为 String/CharSequence。 stackoverflow.com/questions/16027229/…
  • @Jesper:我要匹配文件的内容
  • 所以加载文件的内容,并将其传递给match...

标签: java compilation matcher


【解决方案1】:

当然你不能将文件转换为 CharSequence,它们之间没有任何关系。

Pattern 类中的方法 matcher 接受一个 CharSequence 参数,因此您需要将一个 CharSequence(很可能是一个字符串)传递给它。

您需要读取文件的内容。有很多方法,这完全取决于您是否知道您的文件是大还是小。如果它很小,那么您可以读取所有行,将它们收集到一个字符串中并将其传递给matcher 方法。如果它很大,那么您无法一次全部读取(您会消耗大量内存),因此您需要分块读取它。

考虑到您需要查看内容并找到特定模式,这可能很困难 - 假设您的模式比单个块长。因此,如果您的文件真的很大,我建议您更多地考虑正确的方法。

检查这个以读取文件的内容:How do I create a Java string from the contents of a file?

【讨论】:

    【解决方案2】:

    我以这种方式修改了方法:

     public void countWord(String word, File file) throws FileNotFoundException {
                    int count = 0; 
                    Scanner scanner = new Scanner(file);
                    while (scanner.hasNextLine()) {
                    String nextToken = scanner.next();
    
                    Pattern pattern = Pattern.compile(word);
                    java.util.regex.Matcher matcher = pattern.matcher(nextToken);
    
                    while (matcher.find()) {
                    count++;
                    System.out.println("found: " + count + " : "
                                    + matcher.start() + " - " + matcher.end());
                        }
                    }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多