在 Java 8 中使用 Scanner 找不到模式

Cant find pattern with Scanner in Java 8

提问人:Taylor 提问时间:1/16/2021 更新时间:1/22/2021 访问量:365

问:

我正在 eclipse 上使用 Java 8 并尝试使用正则表达式来检测文件中的字符串,但我没有检测到任何东西。我已经自行测试了正则表达式,它成功地匹配了我正在搜索的文件中的字符串。我成功地从文件中读取,因为我能够打印整个东西。我还尝试了使用 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:尝试访问类型为“Address”的 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"
则表达 java-8 java.util.scanner

评论

0赞 khelwood 1/16/2021
hasNext(Pattern): “如果下一个完整的标记与指定的模式匹配,则返回 true”。如果你的文本不是以匹配的东西开头的(它没有),那么在你检查它的时候将是假的。\w+Exceptions.hasNext(p)
0赞 VGR 1/16/2021
无需将 Windows 文件名中的反斜杠加倍。 就足够了。new File("C:\\Users\\textFileLocation.txt")

答:

2赞 Arvind Kumar Avinash 1/16/2021 #1

您未正确使用正则表达式 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"

课程:正则表达式中了解有关 Java 正则表达式 API 的更多信息。

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

0赞 winstar 1/16/2021 #2

默认情况下,扫描程序使用任何空格作为分隔符。我认为您的目标是逐行处理文件,因此我希望像以下内容一样工作:

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

有关 Scanner 类的详细信息,请参阅:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

0赞 WJS 1/16/2021 #3

试试这个。

  • ^开始生产线
  • $生产线结束
  • .匹配除换行符以外的任何字符。
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();
} 

评论

0赞 Taylor 1/20/2021
这很接近,但我想切断java.lang。因为它只会变得多余。不过,你的结局比我所拥有的要干净得多。谢谢!我要偷那个
0赞 WJS 1/20/2021
无论你能用什么都可以。这就是我参与这个网站的原因。但请记住,您可以在不同的包中具有类似名称的异常。在这些情况下,包名称可能很有用。
0赞 user14410324 1/16/2021 #4

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

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