提问人:Taylor 提问时间:1/16/2021 更新时间:1/22/2021 访问量:365
在 Java 8 中使用 Scanner 找不到模式
Cant find pattern with Scanner in Java 8
问:
我正在 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"
答:
您未正确使用正则表达式 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 自动关闭资源。
默认情况下,扫描程序使用任何空格作为分隔符。我认为您的目标是逐行处理文件,因此我希望像以下内容一样工作:
s = new Scanner(logText).useDelimiter("\\n");
有关 Scanner 类的详细信息,请参阅: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 的扫描仪,但您可以尝试使用 Pattern.MULTILINE 模式编译您的模式,以便 ^ 和 $ 将标记一行的开头和结尾以及整个输入序列,而不仅仅是整个输入序列。
例如:Pattern.compile("your pattern", Pattern.MULTILINE);
评论
hasNext(Pattern)
: “如果下一个完整的标记与指定的模式匹配,则返回 true”。如果你的文本不是以匹配的东西开头的(它没有),那么在你检查它的时候将是假的。\w+Exception
s.hasNext(p)
new File("C:\\Users\\textFileLocation.txt")