拆分基于Pattern Java的字符串

时间:2014-03-12 08:29:03

标签: 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,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],)“;      String parsedLogMessage [] = GetLogString()。split(pattern);      this.MessageContent = Arrays.asList(parsedLogMessage);

这只给出了由正则表达式分割的字符串而不是正则表达式字符串本身

3 个答案:

答案 0 :(得分:1)

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

Pattern p = Pattern.compile("(^[^,]*)(.*$)");
Matcher m = p.matcher(inputstring);
m.matches();
String part1 = m.group(1);
String part2 = m.group(2);

然后part1应该是第一个逗号的所有内容,part2输入字符串的其余部分。

使用substring会更容易......

答案 1 :(得分:0)

每次找到逗号或\n换行符时,这将分割字符串:

String[] parsedString = logString.split("(,|\n)");

它应该产生你想要的输出,但我预见到的潜在问题很少:

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

其次请记住,日志输出本身可以有逗号,因此上面的代码会有错误。由于前缀部分似乎是固定长度,因此您可能希望使用子字符串来切断它们。

答案 2 :(得分:0)

假设您的字符串参数介于两个特殊字符之间,例如:#parameter#或参数,或者甚至两个不同的符号,例如* paramter#。我们可以通过以下代码在这些符号之间列出所有这些参数:

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());
        }

    }
}

此处列表结果将包含参数n1_1,n2_2,n4_4。