Java 拆分/删除特定字符串的有效方法

Java 拆分/删除特定字符串的有效方法,java,regex,string,split,Java,Regex,String,Split,我有以下字符串示例: [14:48:51.690] LOGON error group: 103 我和他们有很多不同之处。唯一的问题是,开始总是相同的,除了日期(总是在括号中)和登录名。我想把前面的东西取下来。 我如何才能有效地实现这一点?正则表达式?拆分并从阵列中删除 我最后唯一想要的就是 error group: 103 您可以根据正则表达式\[\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}\]\s*\w*\s* import java.util.r

我有以下字符串示例:

[14:48:51.690] LOGON           error group: 103
我和他们有很多不同之处。唯一的问题是,开始总是相同的,除了日期(总是在括号中)和登录名。我想把前面的东西取下来。 我如何才能有效地实现这一点?正则表达式?拆分并从阵列中删除

我最后唯一想要的就是

error group: 103

您可以根据正则表达式
\[\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

下面是使用简单正则表达式的另一种方法:

    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));           
    }
基本上我们扫描开始括号,里面的日期,结束括号,任何空格 在“直到”和“捕获”之间,使用
(.*)

捕获您要查找的部分,假设事件文本(“登录”在您的情况下)都是大写字母和一个单词:

String target = str.replaceAll(".*?\\]\\s*[A-Z]+\\s*", "");

正则表达式是一项非常昂贵的任务。如果您正在搜索一个包含100000行的日志文件,这将花费太多时间!如果您的字符串始终具有相同的模式,请尝试利用它

我假设你的线路是:

[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;

     }
}
公共类HelloWorld{
公共静态void main(字符串[]args){
字符串s=“[14:48:51.690]登录错误组:103”;
int pos=getPosOfFirstAlphaNumericCharAfterSecondSpace;
如果(位置>0)
系统输出println(s.substring(pos));
}
私有静态int getPosOfFirstAlphaNumericCharAfterSecondSpace(字符串s){
int countSpaces=0;
对于(int i=0;i=2)
返回i;
}
返回-1;
}
}

它是否总是在一定数量的字符后开始。如果是这样,您可以只使用
line.substring(n)
@aioobe No。例如,日期可以采用这种格式[1:1:22.333],并且登录一词可以不同。日期后是否总是只有一个“事件”词?但这只适用于日期正好是[2编号:2编号:2编号.3编号]@MarcelHöll No,因为
d{1,2}
@adam.kubi等等什么?哦它可以是基于d{1,2)的1位或2位数字,以及基于d{1,3}的1到3位数字。如果
str
指向此
“[14:48:51.690]登录错误组:103”
并且
目标
变量是用SOP打印出来的。@user\u我有一个输入错误(遗漏了一个“*”)。我已经修正了答案(并测试了它,它运行正常)。圣诞快乐!这应该是公认的答案。正则表达式确实很昂贵,以后更难阅读和解码,更容易出错,而且经常被不必要地过度使用。