
在处理日志或结构化文本时,我们经常需要从复杂字符串中提取特定信息。本案例中,输入是一个多行字符串,每行代表一个记录,格式大致如下:
#Section<区段号>,Main,First/HS/12345/<姓名>/<性别>,<日期1> <数值1> <日期2> <数值2>,...
我们的目标是:
为了应对日期和数值对数量不定的挑战,我们采取两阶段策略:
我们将使用以下正则表达式:
#Section(d+)(?:(?!#Sectiond).)*Jack/M,(d+h+[-+]?d+(?:.d+)?(?:s+d+h+[-+]?d+(?:.d+)?)*)
下面详细解释其各个部分:
立即学习“Java免费学习笔记(深入)”;
我们将使用Java的 Pattern 和 Matcher 类来执行正则表达式匹配,并对捕获到的组进行后处理。
示例数据:
String string = "#Section250342,Main,First/HS/12345/Jack/M,200010 10.00 200011 -2.00,
"
+ "#Section250322,Main,First/HS/12345/Aaron/N,200010 17.00,
"
+ "#Section250399,Main,First/HS/12345/Jimmy/N,200010 12.00,
"
+ "#Section251234,Main,First/HS/12345/Jack/M,200011 11.00";Java代码:逐条处理匹配结果
此代码片段将迭代每个匹配项,并为每个匹配项分别输出区段号、日期列表和数值列表。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DataExtractor {
public static void main(String[] args) {
String regex = "#Section(\d+)\b(?:(?!#Section\d).)*\bJack/M,(\d+\h+[-+]?\d+(?:\.\d+)?(?:\s+\d+\h+[-+]?\d+(?:\.\d+)?)*)";
String string = "#Section250342,Main,First/HS/12345/Jack/M,200010 10.00 200011 -2.00,
"
+ "#Section250322,Main,First/HS/12345/Aaron/N,200010 17.00,
"
+ "#Section250399,Main,First/HS/12345/Jimmy/N,200010 12.00,
"
+ "#Section251234,Main,First/HS/12345/Jack/M,200011 11.00";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
System.out.println("--- 逐条匹配结果 ---");
while (matcher.find()) {
List<String> dates = new ArrayList<>();
List<String> values = new ArrayList<>();
// 捕获组1:区段号
System.out.println("Group 1 (Section ID): " + matcher.group(1));
// 捕获组2:日期和数值的完整字符串,进行后处理
String[] parts = matcher.group(2).split("\s+"); // 按空格分割
for (int i = 0; i < parts.length; i++) {
if (i % 2 == 0) { // 偶数索引是日期
dates.add(parts[i]);
} else { // 奇数索引是数值
values.add(parts[i]);
}
}
System.out.println("Group 2 (Dates): " + Arrays.toString(dates.toArray()));
System.out.println("Group 3 (Values): " + Arrays.toString(values.toArray()));
System.out.println();
}
}
}输出结果:
--- 逐条匹配结果 --- Group 1 (Section ID): 250342 Group 2 (Dates): [200010, 200011] Group 3 (Values): [10.00, -2.00] Group 1 (Section ID): 251234 Group 2 (Dates): [200011] Group 3 (Values): [11.00]
Java代码:聚合所有匹配结果
如果您需要将所有匹配到的区段号、日期和数值分别收集到各自的总列表中,可以使用以下修改后的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AggregateDataExtractor {
public static void main(String[] args) {
String regex = "#Section(\d+)\b(?:(?!#Section\d).)*\bJack/M,(\d+\h+[-+]?\d+(?:u002e\d+)?(?:\s+\d+\h+[-+]?\d+(?:u002e\d+)?)*)";
String string = "#Section250342,Main,First/HS/12345/Jack/M,200010 10.00 200011 -2.00,
"
+ "#Section250322,Main,First/HS/12345/Aaron/N,200010 17.00,
"
+ "#Section250399,Main,First/HS/12345/Jimmy/N,200010 12.00,
"
+ "#Section251234,Main,First/HS/12345/Jack/M,200011 11.00";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);
List<String> allSectionIds = new ArrayList<>();
List<String> allDates = new ArrayList<>();
List<String> allValues = new ArrayList<>();
while (matcher.find()) {
allSectionIds.add(matcher.group(1)); // 收集所有区段号
String[] parts = matcher.group(2).split("\s+");
for (int i = 0; i < parts.length; i++) {
if (i % 2 == 0) {
allDates.add(parts[i]); // 收集所有日期
} else {
allValues.add(parts[i]); // 收集所有数值
}
}
}
System.out.println("--- 聚合所有匹配结果 ---");
System.out.println("All Section IDs: " + Arrays.toString(allSectionIds.toArray()));
System.out.println("All Dates: " + Arrays.toString(allDates.toArray()));
System.out.println("All Values: " + Arrays.toString(allValues.toArray()));
}
}输出结果:
--- 聚合所有匹配结果 --- All Section IDs: [250342, 251234] All Dates: [200010, 200011, 200011] All Values: [10.00, -2.00, 11.00]
通过这种结合正则表达式的强大模式匹配能力和Java编程语言的灵活数据处理能力的方法,我们可以有效地从复杂、非结构化的文本中提取出所需的结构化信息,即使数据格式存在一定的变数。
以上就是使用正则表达式和Java后处理从复杂日志字符串中提取结构化数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号