在 Java 8 中无法使用扫描仪找到模式
Cant find pattern with Scanner in Java 8
我正在使用 Java 8 on eclipse 并尝试使用正则表达式来检测文件中的字符串,但我没有检测到任何东西。我自己测试了正则表达式,它成功匹配了我正在搜索的文件中的字符串。我成功地从文件中读取,因为我能够打印整个文件。我还尝试了使用 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"
您没有正确使用正则表达式 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自动关闭资源。
默认情况下,扫描程序使用任何空格作为分隔符。我想你的目标是逐行处理文件,所以我希望像下面这样的东西能起作用:
s = new Scanner(logText).useDelimiter("\n");
有关扫描仪 class 的更多信息可在此处找到: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.MULTILINE 模式编译模式,这样 ^ 和 $ 将标记行的开头和结尾 和整个输入序列,而不仅仅是整个输入序列。
例如:Pattern.compile("your pattern", Pattern.MULTILINE);
我正在使用 Java 8 on eclipse 并尝试使用正则表达式来检测文件中的字符串,但我没有检测到任何东西。我自己测试了正则表达式,它成功匹配了我正在搜索的文件中的字符串。我成功地从文件中读取,因为我能够打印整个文件。我还尝试了使用 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"
您没有正确使用正则表达式 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自动关闭资源。
默认情况下,扫描程序使用任何空格作为分隔符。我想你的目标是逐行处理文件,所以我希望像下面这样的东西能起作用:
s = new Scanner(logText).useDelimiter("\n");
有关扫描仪 class 的更多信息可在此处找到: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.MULTILINE 模式编译模式,这样 ^ 和 $ 将标记行的开头和结尾 和整个输入序列,而不仅仅是整个输入序列。
例如:Pattern.compile("your pattern", Pattern.MULTILINE);