Java 如何使用正则表达式添加分隔符?
您好,我这里有一个示例日志文件:Java 如何使用正则表达式添加分隔符?,java,regex,netbeans,Java,Regex,Netbeans,您好,我这里有一个示例日志文件: 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 %LOGSOU
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}\s\d{1,2}\s\d{2}:\d{2}:\d{2})(\s)(drop)));
}
System.out.println(listString);
}
公共类测试{
公共静态void main(字符串[]args)引发FileNotFoundException{
Scanner inFile1=新扫描仪(新文件(“文件名”))。使用分隔符(;);
List temps=new ArrayList();
字符串listString=“”;
while(inFile1.hasNext()){
//查找下一行
字符串token1=inFile1.next();
临时添加(标记1);
}
inFile1.close();
for(字符串s:temps){
listString+=s+“\t”;
replaceAll(s,([a-zA-Z]{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2})(\s)(drop));
}
System.out.println(listString);
}
上面的方法应该有效。您不需要所有的括号。出现这种特殊异常的原因可能是因为原始表达式中左括号和右括号的数量不匹配。该方法接受两个字符串参数
您需要将正则表达式模式封装在引号中。此外,在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;");
它仍然给出一个错误,即:在索引50([a-zA-Z]{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2})(\s)(drop)附近的线程“main”java.util.regex.PatternSyntaxException:Unmatched closing')中出现异常)@ih8coding删除正则表达式模式的最后一个字符)
,但正如@winterind所说,您可能不需要所有这些组,您可以在不使用所有括号的情况下编写模式。因此,您希望使用“Jan 1 22:54:41 drop%LOGSOURCE%…”
并插入分号以获得“Jan 1 22:54:41;drop;%LOGSOURCE%”
?如果不是,请在之前/之后显示,以便我们知道您想要什么。@Bohemian是的,那就是我想要的,是“drop”一个变化的词,还是它总是字面上的drop
?@Bohemian它总是字面上的日志文件中的一个条目。
line = line.replaceAll("^(... \\d+ .{8}) drop ", "$1;drop;");