在 Java 8 中无法使用扫描仪找到模式

Cant find pattern with Scanner in Java 8

我正在使用 Java 8 on eclipse 并尝试使用正则表达式来检测文件中的字符串,但我没有检测到任何东西。我自己测试了正则表达式,它成功匹配了我正在搜索的文件中的字符串。我成功地从文件中读取,因为我能够打印整个文件。我还尝试了使用 Pattern.compile() 的更简单的正则表达式,例如尝试匹配单个字母。但无论输入什么,它都检测不到任何东西。

有人知道会发生什么吗?

        File logText = new File("C:\\Users\\textFileLocation.txt");
        Scanner s;
        try {
            s = new Scanner(logText);
            Pattern p = Pattern.compile("\w+Exception:[^\n]+");
            System.out.println(s.hasNext(p));
            
            while(s.hasNextLine()){
                System.out.println(s.nextLine());
            }
            
            s.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
             

文件内容如下:

2021-01-14 12:06:33,165 错误服务器内部服务器异常 #11: java.lang.IllegalStateException:尝试访问“地址”类型的 bean

这是输出

false
2021-01-14 12:06:33,165 ERROR Server INTERNAL SERVER EXCEPTION #11:
java.lang.IllegalStateException: Attempt to access bean of type "Address"

您没有正确使用正则表达式 API。您可以使用 Matcher#find 来检查匹配。下面是演示代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        File logText = new File("textFileLocation.txt");
        Pattern p = Pattern.compile("\w+Exception:[^\n]+");
        try (Scanner s = new Scanner(logText)) {
            while (s.hasNextLine()) {
                String str = s.nextLine();
                boolean found = p.matcher(str).find();
                System.out.println(found);
                if (found) {
                    System.out.println(str);
                }
            }
        }
    }
}

输出:

true
2021-01-14 12:06:33,165 ERROR Server INTERNAL SERVER EXCEPTION #11: java.lang.IllegalStateException: Attempt to access bean of type "Address"

Lesson: Regular Expressions.

了解有关 Java 正则表达式 API 的更多信息

此外,我建议您使用try-with-resources自动关闭资源。

默认情况下,扫描程序使用任何空格作为分隔符。我想你的目标是逐行处理文件,所以我希望像下面这样的东西能起作用:

s = new Scanner(logText).useDelimiter("\n");

有关扫描仪 class 的更多信息可在此处找到:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

像这样尝试。

  • ^ 行首
  • $ 行尾
  • . 匹配除换行符之外的任何字符。
File logText = new File("f:/textFileLocation.txt");
Scanner s;
Pattern p = Pattern.compile("^.+Exception:.*$");
try {
    s = new Scanner(logText);
    String line;
    while (s.hasNextLine()) {
        if (p.matcher(line = s.nextLine()).matches()) {
            System.out.println(line);
        }
    }
    s.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} 

不确定这是否适用于使用模式的扫描仪,但您可以尝试使用 Pattern.MULTILINE 模式编译模式,这样 ^ 和 $ 将标记行的开头和结尾 整个输入序列,而不仅仅是整个输入序列。

例如:Pattern.compile("your pattern", Pattern.MULTILINE);