您好我在这里有一个示例日志文件:
Jan 1 22:54:17 drop %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245};
Jan 1 22:54:22 drop %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245};
Jan 1 22:54:23 drop %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245};
Jan 1 22:54:41 drop %LOGSOURCE% >eth1 rule: 7; rule_uid: {C1336766-9489-4049-9817-50584D83A245};
默认分隔符是分号(;),我想分隔时间戳和“drop”,以及带有该分隔符的“drop”和“%LOGSOURCE%”。我没有得到我预期的结果。整个代码是插入分隔符。)我的主要想法是将ArrayList中的日志文件添加到String(根据我目前的Java知识可以使用正则表达式)并相应地添加分隔符。
错误如下所示:
线程“main”中的异常java.lang.RuntimeException:无法编译的源代码 - 错误的树类型: 在testing.Testing.main(Testing.java:31),它从行listString.replaceAll(“regex command”)开始
注意:我只是尝试将分隔符放在时间戳和“drop”之间并发生错误。我不明白如何使用正则表达式,我真的需要帮助!
public class Testing {
public static void main(String[] args) throws FileNotFoundException {
Scanner inFile1 = new Scanner(new File("filename")).useDelimiter(";");
List<String> temps = new ArrayList<String>();
String listString = "";
while (inFile1.hasNext()) {
// find next line
String token1 = inFile1.next();
temps.add(token1);
}
inFile1.close();
for (String s : temps) {
listString += s + "\t";
listString.replaceAll(s,([a-zA-Z]{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2})(\s)(drop)));
}
System.out.println(listString);
}
答案 0 :(得分:1)
"[a-zA-Z]{3}\\s\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\sdrop"
以上应该有效。您不需要所有括号。您获得该特定异常的原因可能是因为原始表达式中的左括号和右括号的数量不匹配
答案 1 :(得分:0)
String.replaceAll(String regex,
String replacement)方法接受两个String
参数。
您需要将正则表达式模式封装在引号中。此外,在java中,您需要转义正则表达式中的/
个字符。
使用replaceAll(...)
方法的行应如下所示:
listString.replaceAll("([a-zA-Z]{3}\\s\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2})(\\s)(drop)",s);
答案 2 :(得分:0)
由于行前缀中除日期之外的所有日期都是固定长度,因此最简单的解决方案是:
line = line.replaceAll("^(... \\d+ .{8}) drop ", "$1;drop;");