在Java 8的扫描器中找不到模式



我正在eclipse上使用Java 8,并试图使用regex来检测文件中的字符串,但我没有检测到任何东西。我自己测试了正则表达式,它成功地匹配了我正在搜索的文件中的字符串。我成功地从文件中读取,因为我能够打印整个内容。我还用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();
}

文件内容如下:

2012-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"

您没有正确使用正则表达式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 regex API.

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

默认情况下,扫描器使用任何空格作为分隔符。我认为你要做的是逐行处理文件,所以我希望像下面这样的工作:

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

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

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

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

试一下。

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

最新更新