[英]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.