我有这个使用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
我怎样才能通过这个障碍?
答案 0 :(得分:1)
当然你不能把文件转换为CharSequence,它们彼此无关。
Pattern类中的方法matcher
接受CharSequence参数,因此您需要将CharSequence(很可能是String)传递给它。
您需要阅读该文件的内容。有很多方法,这取决于你是否知道你的文件是大还是小。如果它很小,那么你可以只读取所有行,将它们收集到一个字符串中并将其传递给matcher
方法。如果它很大,那么你不能一次读取它(你会消耗大量的内存)所以你需要以块的形式阅读它。
考虑到您需要查看内容并找到特定模式,这可能很难 - 假设您的模式比单个模块长。因此,如果您的文件非常大,我建议您更多地考虑正确的方法。
选中此项以阅读文件内容:How do I create a Java string from the contents of a file?
答案 1 :(得分:0)
我以这种方式修改了方法:
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());
}
}
由于