嗨,我这里有一个示例日志文件:
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",以及带"%LOGSOURCE%"的"drop"。我没有得到预期的结果。这整个代码是用来插入分隔符的。)我的主要想法是将日志文件从ArrayList添加到字符串中(根据我目前的Java知识,可以使用正则表达式),并相应地添加分隔符。
错误如下:
线程"main"异常java.lang.RuntimeException:不可编译的源代码-错误的树类型:在testing.Testing.main(Testing.java:31)中,它从listString行开始。replaceAll (regex命令)
注意:我只是尝试将分隔符放在时间戳和"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}sd{1,2}sd{2}:d{2}:d{2})(s)(drop)));
}
System.out.println(listString);
}
"[a-zA-Z]{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2}\sdrop"
以上应该可以工作。你不需要所有的括号。出现这种异常的原因可能是原始表达式中左右括号的数量不匹配
字符串。replaceAll(字符串正则表达式,字符串替换)方法接受两个String
参数。
你需要用引号封装regex模式。此外,在java中,您需要转义正则表达式模式中的/
字符。
使用replaceAll(...)
方法的行应该看起来像这样:
listString.replaceAll("([a-zA-Z]{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2})(\s)(drop)",s);
由于行前缀中除了日期以外的其他日期都是固定长度,因此最简单的解决方案是:
line = line.replaceAll("^(... \d+ .{8}) drop ", "$1;drop;");