繁体   English   中英

根据Pattern Java分割字符串

[英]Splitting a string based on Pattern Java

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

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(pattern); 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应该是输入part2的其余部分。

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

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

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

它应该产生所需的输出,但是我预见到这里几乎没有潜在的问题:

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

其次,请记住,日志输出本身可以包含逗号,因此上面的代码有问题。 由于前缀部分似乎是固定长度的,因此您可能需要使用子字符串来将它们切碎。

假设您的字符串参数位于两个特殊字符之间,例如:#parameter#或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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM