我有以下字符串示例:
[14:48:51.690] LOGON error group: 103
我和他们有很多不同。唯一的事情是,开头总是相同的期望日期(总是在括号中)和名称LOGON
。我想在前面删除你。
如何有效地实现这一目标?正则表达式?拆分并从数组中删除?
我唯一想要的就是
error group: 103
答案 0 :(得分:2)
您可以根据正则表达式\[\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}\]\s*\w*\s*
import java.util.regex.Pattern;
public class T {
public static void main(String[] args) {
String s = "[14:48:51.690] LOGON error group: 103";
String[] split = s.split("\\[\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}\\]\\s*\\w*\\s*");
System.out.println(split[1]);
}
}
输出
error group: 103
答案 1 :(得分:1)
以下是使用简单正则表达式的另一种方法:
Pattern pattern = Pattern.compile("\\[.*\\]\\s*LOGON\\s*(.*)\\s*");
Matcher matcher = pattern.matcher("[14:48:51.690] LOGON error group: 103");
if (matcher.find()) {
System.out.println(matcher.group(1));
}
所以基本上我们扫描开括号,它里面的日期,结束括号,任何空格
介于两者之间,直到并使用(.*)
捕获您正在寻找的部分。
答案 2 :(得分:1)
正则表达式是一项非常昂贵的任务。如果您正在搜索包含100,000行的日志文件,则需要花费太多时间!如果您的字符串始终具有相同的模式,请尝试使用它!
我假设您的行是:
[some_time] some_event some event description
我现在能看到的最简单的方法就是搜索第二个空格,然后获取所有内容。
public class HelloWorld{
public static void main(String []args){
String s = "[14:48:51.690] LOGON error group: 103";
int pos = getPosOfFirstAlphaNumericCharAfterSecondSpace(s);
if (pos > 0)
System.out.println(s.substring(pos));
}
private static int getPosOfFirstAlphaNumericCharAfterSecondSpace(String s) {
int countSpaces = 0;
for(int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ')
countSpaces++;
else if (countSpaces >= 2)
return i;
}
return -1;
}
}
答案 3 :(得分:0)
假设事件文本(在您的情况下为“LOGIN”)是全部大写和一个字:
String target = str.replaceAll(".*?\\]\\s*[A-Z]+\\s*", "");