我想简化我的日志文件解析器,用模板引擎替换复杂的正则表达式。其思想是逆转模板引擎的过程,并给出模板描述和有效的结果文件作为输入。多行日志文件如下所示:
*** ID: X821 ***
- type: B5
- time-stamp: 20160202T01:11:01.2991
* Device: XKK-255141它们都具有相同的结构,可以用伪模板语言描述:
*** ID: {{string}} ***
- type: {{string}}
- time-stamp: {{date}}
* Device: XKK-{{integer}}是否有一个模板引擎可以解析日志文件、查找模板文件中的结构并返回HashMap/List/Object中的内容?
注意:我知道我可以用编写一个简单的DSL。但是这里的想法是简化解析,并接受只支持基本的多行日志文件而不支持递归。
发布于 2016-04-13 01:04:47
我不知道现有的模板引擎会这样做(它们通常反过来工作,用数据填充模板)。
为什么不用这样的方法:
class ReverseTemplateEngine {
ArrayList<String> prefixes = new ArrayList();
ArrayList<String> suffixes = new ArrayList();
public ReverseTemplateEngine(String... templates) {
for (String s: templates) {
int cut = s.indexOf("$");
suffixes.add(s.substring(0, cut));
prefixes.add(s.substring(cut + 1);
}
}
public List<String> parse(BufferedReader r) {
ArrayList<String> result = new ArrayList<>();
while (true) {
String line = reader.readLine();
for (int i = 0; i < prefixes.length; i++) {
if (line.startsWith(prefixes.get(i))
&& line.endsWith(suffixes.get(i)) {
result.add(line.substring(prefixes.get(i).length(),
line.length() - suffixes.get(i).length()));
break;
}
}
}
return list;
}
}用法:
ReverseTemplateEngine rte = new ReverseTemplateEngine(
"*** ID: $ ***",
"- type: $",
"- time-stamp: $",
"* Device: XKK-$");
List<String> result = rte.parse(new BufferedReader(
new FileReader("yourfile.txt")));发布于 2016-04-15 18:45:08
一个“简单的”多线Regex怎么样?
String test =
"*** ID: X821 ***\n" +
"- type: B5\n" +
"- time-stamp: 20160202T01:11:01.2991";
java.util.regex.Pattern p = java.util.regex.Pattern.compile(
"^\\*\\*\\* ID: (\\S+) \\*\\*\\*\\s+" +
"- type: (\\S+)\\s+" +
"- time-stamp: (\\S+)",
java.util.regex.Pattern.MULTILINE);
java.util.regex.Matcher m = p.matcher(test);
if(m.find()) {
System.out.println("ID = " + m.group(1));
System.out.println("type = " + m.group(2));
System.out.println("time = " + m.group(3));
}写起来有点乱,因为反斜杠和通配符逃跑了,但它确实有作用.(在这个逻辑的基础上,您可以轻松地编写一个字符串转换,如果您愿意,可以将模板匹配的字符串映射到regex )。
发布于 2016-04-13 00:44:07
他们有很多。
看看YAML和JSON。它们真的很容易使用。
唯一的问题是,您必须遵循每种模板语言的格式。
下面是用这些语言编写文件的方式。
YAML
-- YAML
ID : X821
type : B5
time-stamp : 2016-02-02 01:11:01.2991
Device :
- XKK : 255141JSON
{
"__comment" : "JSON",
"ID": "X821",
"type": "B5",
"time-stamp": 20160202T01:11:01.2991,
"Device": {
"XKK": 255141
}
}https://stackoverflow.com/questions/36586199
复制相似问题