簡體   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