gpt4 book ai didi

Java 读取文件行并仅提取有用的信息

转载 作者:行者123 更新时间:2023-12-02 12:29:53 26 4
gpt4 key购买 nike

我有文件 file1、file2 包含以下内容:

[2017-02-01 10:00:00 开始运行 [错误:是] [正在执行:否] [完成:] [提醒:] [警报号:123456789] [日志号:123456789] [引用: -1:2:-1:-1:-1] [类型:2:发生大问题] [标志:0:]]<---这一行1

第2行:相同的第 1 行除了 date、type、logno 和 Alarmno 之外有时还包含 + 或 - 符号。...其他线路我已经将所有这些行读取到字符串 myLines 列表中。(注意:file1 的内容将是 myLines 的第一个元素,以逗号分隔,myLines 的第二个元素将是 file2 的内容,以逗号分隔,依此类推。例如,myLines 列表的第一个元素:

[2017-02-01 10:00:00 start running [error:yes] [doing:no] [finish:] [remind:] [alarmno:123456789] [logno:123456789] [ref:-1:2:-1:-1:-1] [type:2:big issues happen] [flag:0:],
2017-02-01 10:00:00 start running [error:yes] [doing:no] [finish:] [remind:] [alarmno:123456789] [logno:123456789] [ref:-1:2:-1:-1:-1] [type:2:big issues happen] [flag:0:]]

<--- 这是 myLines 的第一个元素,列出了 file1 的内容如果文件包含一行,则意味着 myLines 列表的第一个元素将仅包含该行且不以逗号分隔。 我只想要

  1. 每行开头的日期
  2. alarmno(只有数字 no,而不是示例中的单词)上面一行:123456789)
  3. 上行中的logno (123456789)
  4. 例如,在上面的行中类型以下文本(大发生问题)

这是我尝试过的:

String regex = "\\d{2}:\\d{2}:\\d{2}\\s+\\w*\\s+\\w*\\s+\\[\\w*:\\w*]\\s+\\[\\w*:\\]\\s+\\[\\w*:\\]\\s+\\[\\w*:\\]";
String s=null;
for(int i=0; i<myLines.size(); i++)
{
s = myLines.get(i).replaceAll(regex," ");
}

但是结果是日期和警报号:12345...以及其他行内容。我什至试图重复这个表达,但无济于事。有什么方法可以用java实现吗?

最佳答案

您可以使用

^\[?(\d[\d-]+).*?\[alarmno:(\w*)].*?\[logno:(\w*)].*?\[type:\w*:([^\]]*)]

请参阅regex demo

详细信息:

  • ^ - 字符串开头
  • \[? - 可选的 [
  • (\d[\d-]+) - 第 1 组:一个数字和 1 个或多个数字或 -s
  • .*? - 除换行符之外的任何 0+ 字符尽可能少
  • \[alarmno: - [alarmno: 子字符串
  • (\w*) - 第 2 组:0+ 个单词字符
  • ] - 文字 ]
  • .*? - 除换行符之外的任何 0+ 字符尽可能少
  • \[logno: - 文字 [logno: 子字符串
  • (\w*) - 第 3 组:0+ 个单词字符
  • ] - ]
  • .*? - 除换行符之外的任何 0+ 字符尽可能少
  • \[type: - [type: 子字符串
  • \w* - 0+ 个单词字符
  • : - 冒号
  • ([^\]]*) - 第 4 组:0+ 个除 ] 之外的字符
  • ] - ]

Java demo :

String s = "[2017-08-17 08:00:00 Comming in [Contact:NO] [REF:] [REF2:] [REF3:] [Name:+AA] [Fam:aa] [TEMP:-2:0:-2:0:-2] [Resident:9:free] [end:0:]";
Pattern pat = Pattern.compile("^\\[*(\\d[\\d: -]+\\d).*?\\[Name:([^]]*)].*?\\[Fam:(\\w*)].*?\\[Resident:\\w*:([^]]*)]");
Matcher matcher = pat.matcher(s);
if (matcher.find()){
System.out.println("Date: " + matcher.group(1));
System.out.println("Name: " + matcher.group(2));
System.out.println("Fam: " + matcher.group(3));
System.out.println("Resident: " + matcher.group(4));
}

输出:

Date: 2017-08-17 08:00:00
Name: +AA
Fam: aa
Resident: free

关于Java 读取文件行并仅提取有用的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com