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

时间:2017-07-26 19:18:27

标签: java arrays regex list file

我有文件file1,file2包含如下内容:

[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:]]< ---此line1

线路2: 除日期,类型,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,而不是forxex中的单词 以上行:123456789)
  3. 上一行中的 logno (123456789)
  4. 类型例如上面一行中的以下文字(大 问题发生)
  5. 这是我尝试过的:

    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中实现它?

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • \[? - 可选的[
  • (\d[\d-]+) - 第1组:一位数字和一个或多个数字或- s
  • .*? - 除了换行符之外的任何0 +字符尽可能少
  • \[alarmno: - [alarmno:子字符串
  • (\w*) - 第2组:0 +字字符
  • ] - 文字]
  • .*? - 除了换行符之外的任何0 +字符尽可能少
  • \[logno: - 文字[logno:子字符串
  • (\w*) - 第3组:0 +字字符
  • ] - ]
  • .*? - 除了换行符之外的任何0 +字符尽可能少
  • \[type: - [type:子字符串
  • \w* - 0+ word chars
  • : - 冒号
  • ([^\]]*) - 第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