【问题标题】:Cant find pattern with Scanner in Java 8在 Java 8 中无法使用 Scanner 找到模式
【发布时间】:2021-04-21 00:12:44
【问题描述】:

我在 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:尝试访问“地址”类型的 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"

【问题讨论】:

  • hasNext(Pattern): "如果下一个完整令牌与指定的模式匹配,则返回true"。如果您的文本开始不是以匹配\w+Exception 的内容(它不匹配),那么s.hasNext(p) 在您检查它时将是错误的。
  • Windows 文件名中不需要双反斜杠。 new File("C:\\Users\\textFileLocation.txt") 就足够了。

标签: java regex java-8 java.util.scanner


【解决方案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"

Lesson: Regular Expressions 了解有关 Java 正则表达式 API 的更多信息。

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

【讨论】:

    【解决方案2】:

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

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

    更多关于 Scanner 类的信息可以在这里找到:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这样试试吧。

        • ^ 行首
        • $ 行尾
        • . 匹配除换行符以外的任何字符。
        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();
        } 
        

        【讨论】:

        • 这很接近,但我想切断 java.lang。因为它只会变得多余。不过,您的端线比我所拥有的要干净得多。谢谢!我要去偷那个
        • 你能用什么都好。这就是我参加这个网站的原因。但请记住,您可能在不同的包中具有类似命名的异常。在这些情况下,包名会很有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 2015-09-16
        相关资源
        最近更新 更多