Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java 8中无法使用扫描仪找到模式_Java_Regex_Java 8_Java.util.scanner - Fatal编程技术网

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

在Java 8中无法使用扫描仪找到模式,java,regex,java-8,java.util.scanner,Java,Regex,Java 8,Java.util.scanner,我正在eclipse上使用Java8,并尝试使用正则表达式检测文件中的字符串,但我没有检测到任何东西。我已经单独测试了正则表达式,它成功地匹配了我正在搜索的文件中的字符串。我正在成功地读取文件,因为我能够打印整个文件。我还尝试了使用Pattern.compile()的更简单的正则表达式,就像尝试匹配单个字母一样。但不管输入是什么,它都不会检测到任何东西 有人知道会发生什么吗 File logText = new File("C:\\\\Users\\\\textFile

我正在eclipse上使用Java8,并尝试使用正则表达式检测文件中的字符串,但我没有检测到任何东西。我已经单独测试了正则表达式,它成功地匹配了我正在搜索的文件中的字符串。我正在成功地读取文件,因为我能够打印整个文件。我还尝试了使用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:33165错误服务器内部服务器异常#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"

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

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的更多信息


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

默认情况下,扫描仪使用任何空格作为分隔符。我认为您的目标是逐行处理文件,因此我希望以下方法能够奏效:

s = new Scanner(logText).useDelimiter("\\n");
有关Scanner类的更多信息可以在此处找到:

像这样尝试

  • ^
    行的开头
  • $
    行尾
  • 匹配除换行符以外的任何字符

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


例如:
Pattern.compile(“你的模式”,Pattern.MULTILINE)

hasNext(模式)
:“如果下一个完整令牌与指定模式匹配,则返回true”。如果文本的开头不匹配
\w+异常
(它不匹配),则在检查时,
s.hasNext(p)
将为false。无需在Windows文件名中重复反斜杠<代码>新文件(“C:\\Users\\textFileLocation.txt”)
就足够了。这很接近,但我想切断java.lang。因为它会变得多余。你的终点线比我的要干净得多。谢谢我很高兴你能用什么都行。这就是我参与这个网站的原因。但是请记住,在不同的包中可以有类似的命名异常。在这些情况下,包名可能很有用。
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();
}