基于Java模式拆分字符串

基于Java模式拆分字符串,java,regex,pattern-matching,Java,Regex,Pattern Matching,嗨,我有以下模式的日志文件- 2014-03-06 03:21:45,432 ERROR [mfs:pool-3-thread-19] dispatcher.StatusNotification - Error processing notification. Operation aborted. java.sql.SQLException: Network error IOException: Connection timed out: connect 2014-03-06 03:22:06

嗨,我有以下模式的日志文件-

2014-03-06 03:21:45,432 ERROR [mfs:pool-3-thread-19] dispatcher.StatusNotification  - Error processing notification. Operation aborted.
java.sql.SQLException: Network error IOException: Connection timed out: connect
2014-03-06 03:22:06,454 ERROR [mfs:pool-3-thread-19] dispatcher.ClientStatusNotification  - Error processing notification. Operation aborted.
java.sql.SQLException: Network error IOException: Connection timed out: connect
2014-03-06 03:22:27,462 ERROR [pool-1-thread-1] cluster.ClusterServiceImpl  - unexpected error when trying to update LastCheckinTime
java.sql.SQLException: Network error IOException: Connection timed out: connect
...
我正在尝试将字符串拆分为子字符串,以便-

parsedString[0]=2014-03-06 03:21:45
parsedString[1]=,432 ERROR [mfs:pool-3-thread-19] dispatcher.StatusNotification  - Error processing notification. Operation aborted.
java.sql.SQLException: Network error IOException: Connection timed out: connect
parsedString[2]=2014-03-06 03:22:06
....
我尝试使用
string.split(datepattern)
,但它只提供字符串数组中的内容,而不提供日期。 我也尝试过使用模式匹配器,但它只给出匹配日期的列表,而没有给出内容

如何将这两个值放入同一个字符串数组中。 任何帮助都将不胜感激。 谢谢

编辑- 字符串模式=([0-9]{4}-[0-1][0-9]-[0-3][0-9]\s(?[0-1][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9],); 字符串parsedLogMessage[]=GetLogString().split(模式); this.MessageContent=Arrays.asList(parsedLogMessage)


这只提供由正则表达式分割的字符串,而不是正则表达式字符串本身

如果必须使用正则表达式,可以这样尝试

Pattern p = Pattern.compile("(^[^,]*)(.*$)");
Matcher m = p.matcher(inputstring);
m.matches();
String part1 = m.group(1);
String part2 = m.group(2);
然后,
part1
应该是第一个逗号之前的所有内容,
part2
输入字符串的其余部分


使用
子字符串
会更容易,不过…

每次找到逗号或
\n
换行符时,都会拆分字符串:

String[] parsedString = logString.split("(,|\n)");
它应该会产生您想要的输出,但我在这里预见到的潜在问题很少:

首先,我感觉您试图首先将整个日志文件加载到字符串中。如果要按行处理它们,这是一种很好的内存浪费(如果日志文件为10GB,会发生什么情况?)。更好的方法是使用BufferedReader并按行执行


其次,请记住,日志输出本身可能有逗号,所以上面的代码将有缺陷。由于前缀部分似乎是固定长度的,因此您可能希望改用子字符串将其切碎。

假设字符串参数位于两个特殊字符之间,如:#parameter#或parameter,甚至两个不同的符号,如*parameter#。通过该代码,我们可以得到这些符号之间所有这些参数的列表:

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;

public class Splitter {

    public static void main(String[] args) {

        String pattern1 = "#";
        String pattern2 = "#";
        String text = "(#n1_1#/#n2_2#)*2/#n1_1#*34/#n4_4#";

        Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
        Matcher m = p.matcher(text);
        while (m.find()) {
            ArrayList parameters = new ArrayList<>();
            parameters.add(m.group(1));
            System.out.println(parameters);
            ArrayList result = new ArrayList<>();
            result.add(parameters);
            // System.out.println(result.size());
        }

    }
}
import java.util.ArrayList;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.apache.commons.lang.StringUtils;
公共类拆分器{
公共静态void main(字符串[]args){
字符串模式1=“#””;
字符串模式2=“#””;
String text=“(#n1#u 1#/#n2#u 2#)*2/#n1#u 1#*34/#n4#”;
模式p=Pattern.compile(Pattern.quote(pattern1)+“(.*?”+Pattern.quote(pattern2));
匹配器m=p.Matcher(文本);
while(m.find()){
ArrayList参数=新的ArrayList();
添加(m组(1));
System.out.println(参数);
ArrayList结果=新建ArrayList();
结果。添加(参数);
//System.out.println(result.size());
}
}
}

这里列出的结果将包含参数n1\u 1、n2\u 2、n4\u 4。

请添加您尝试的代码。这样您就不能只使用逗号拆分了吗?或者只抓取逗号的索引,然后再抓取子字符串?内容中没有多次出现逗号,因此我认为这是不可能的。我只需要拆分日期时间值,但这只适用于一行
Pattern.compile((^[^,]*)(.*$),Pattern.MULTILINE)
就可以了。当然,它必须在所有行上进入循环-要么在
p.matcher
之前开始,那么我的解决方案就足够了,或者在
m.matches
之前,这将需要多行方法感谢缺乏更直接的答案,我接受这一点。是的,你可能是对的,将整个日志文件加载到一个字符串中是对良好内存的浪费。我有一个字符串,其中包含这个字符“|”,我想拆分我的字符串,因为这个特殊的字符可以吗分裂