我有文件 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 列表的第一个元素将仅包含该行且不以逗号分隔。 我只想要
- 每行开头的日期
- alarmno(只有数字 no,而不是示例中的单词) 上面一行:123456789)
- 上行中的logno (123456789)
- 例如,在上面的行中类型以下文本(大 发生问题)
这是我尝试过的:
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+ 个除] 之外的字符
]
-]
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/