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