在Java 8中无法使用扫描仪找到模式
我正在eclipse上使用Java8,并尝试使用正则表达式检测文件中的字符串,但我没有检测到任何东西。我已经单独测试了正则表达式,它成功地匹配了我正在搜索的文件中的字符串。我正在成功地读取文件,因为我能够打印整个文件。我还尝试了使用Pattern.compile()的更简单的正则表达式,就像尝试匹配单个字母一样。但不管输入是什么,它都不会检测到任何东西 有人知道会发生什么吗在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
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();
}