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

标签 java arrays regex list file

我有文件 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/

相关文章:

javascript - 如何在 js 数组中搜索?

javascript - Google Apps 脚本 (JavaScript) 正则表达式拆分电子表格单元格引用

java - 如何从 servlet 调用在同一 AppEngine 实例上运行的资源 url

java - hibernate 一对一映射不更新子表

c++ - c++ 中有没有一种方法可以在不先定义大小的情况下初始化一些类对象的数组

arrays - 如何在 Labview 中展平( reshape 为 1D)任意维度的数组

java - NullPointer 与 Arquillian CDI 测试

java - 如何使用 iText 7 在 PDF 文件中添加复选框?

java - 为什么这个正则表达式会捕获排除的字符?

regex - 如何用逗号分割字符串忽略双引​​号中的逗号