我有以下格式的行數
9/14/2021 6。 01:14 PM 42 (3224) 接收率。39338 B/s
9/14/2021 6。 01:29下午92(940)接收率。215363 B/s
我需要從這里提取2個資料:時間戳和實際速率,例如
。9/14/2021 6: 01:14下午,39338。
9/14/2021 6: 01:29下午,215363。
我正在使用分組,并想出了以下模式:
^(. *)s*[0-9]*s ([0-9) )s Receives rate: s ([0-9] )
通過這樣的模式,我成功地回傳了我的第二組(39338,215363),但是對于第一組,它超出了AM/PM點太多,第一組變成了9/14/2021 6:01:14 PM 42。
如果我把模式改為
^(. *) [0-9]*s ([0-9] )s Receives rate: s ([0-9] ) -> 3空格而不是第一個s*。
它與預期相符,但不能保證有3個空格,所以我需要使用帶有零或更多的空白字符。
uj5u.com熱心網友回復:
使用的詞組:
"^(d{1,2}/d{1,2}/d{4}s.*?)s{3}. ?s{3}Receives rate:s (d )"
背景關系中的Regex和測驗平臺:
public static void main(String[] args) {
String input = "9/14/2021 6:01:14 PM 42 (3224) 接收率。39338 B/s
"
"9/14/2021 6:01:29 PM 92 (940) Receive rate: 215363 B/s"。
String regex = "^(d{1,2}/d{1,2}/d{4}s。 *?)s{3}. ?s{3}Receives rate:s (d )";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE)。
Matcher matcher = pattern.matcher(input)。
while(matcher.find()) {
System.out.printf("時間戳。'%s' || Rate: '%s'%n", matcher.group(1), matcher.group(2) )。
}
}
輸出:
時間戳。'9/14/2021 6:01:14 PM' || Rate: '39338'
時間戳。'9/14/2021 6:01:29 PM'| Rate: '215363'
更多的正則運算式結構可以在這里找到:
。
https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html uj5u.com熱心網友回復: 我建議你分別檢索日期-時間和接收-速率部分。對于檢索日期-時間部分,您可以使用豐富的 分別檢索日期-時間和接收-速率部分。
java.time API,然后您可以使用 Java RegEx API 來檢索 Receive-Rate 部分。
檢索日期-時間部分
您可以使用DateTimeFormatter#parse(CharSequence, ParsePosition)來將字串決議為TemporalAccessor,從中可以檢索到LocalDateTime。
從現代日期時間 API*了解更多資訊。日期時間。
檢索接收率部分
你可以使用regex,(?<=(?:Receive rate: ))d (?=(?: B/s))其中(?<=(?: Receive rate: ))和(?=( ?: B/s))已經分別作為正面的lookbehind和正面lookahead模式。
完整的演示:
import java.text.ParsePosition。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern。
import java.util.stream.Stream。
public class Main {
public static void main(String[] args){
// Test
Stream.of(
"9/14/2021 6:01:14 PM 42 (3224) Receive rate: 39338 B/s"。
"9/14/2021 6:01:29 PM 92 (940) Receive rate: 215363 B/s".
)
.forEach(s -> System.out.printf(
"Timestamp: %s, Receive rate: %s%n" ,
getTimestampPart(s),
getReceiveRate(s)
));
}
static String getTimestampPart(String str) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uuu h:mm:ss a", Locale.ENGLISH) 。
return LocalDateTime.from(dtf.parse(str, new ParsePosition(0)) .format(dtf)。
}
static String getReceiveRate(String str) {
Matcher matcher = Pattern.compile("(?<=(?:Receive rate:))d (?=(?: B/s))"/span>).matcher(str)。
return matcher.find() ? matcher.group() : "" ;
}
}
輸出:
Timestamp: 9/14/2021 6: 01:14下午,接收率。39338, 接收率: 39338.
時間戳。9/14/2021 6: 01:29下午,接收率。215363,接收率:29。
*由于任何原因,如果你必須堅持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它將大部分的java.time功能回傳到Java 6 & 7。如果您正在為一個 Android 專案作業,而您的 Android API 水平仍然不符合 Java-8 的要求,請查看通過 desugaring 提供的 Java 8 API 和 如何在 Android 專案中使用 ThreeTenABP。
uj5u.com熱心網友回復:
在這種情況下,你可以更具體一些:
(d{1,2}/d{1, 2}/d{1,4}s d{1,2}。 d{1,2}:d{1,2}s PM)s d s (d*? )s Receives rate:s (d*)s B/ss*
何處:
d{1,2}/d{1,2}/d{1,4}s是第一個日期模式,d{1,2}是 "至少一個但最多兩個數字" - 其次是d{1,2}:d{1,2}:d{1,2}s,這是hh:mm:ss區塊 。
PMs是PM 。
d s (d*?)數字塊 。
Receives rate:s (d*)"Receive rate "與以下數字塊 。
B/ss*結束
或者更懶:
(^[0-9/]*s [0-9: ] s PM)s [0-9()] ? s 接收 速率:s ([0-9] )s B/s
有:
^[0-9/]*s一組數字或/后面有空白,然后[0-9:] s一組數字或:后面有空格 。
[0-9 ()] ?s一組數字,空位或(或)--非貪婪的,后面是空白 。
Receives rate:s字面意思是應該站在那里的空白處 。
([0-9] )s B/s數字塊和其余部分
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/328889.html
標籤:
