模式匹配解析器
其实,我建了一个Java代码来分析下面的文本文件:模式匹配解析器
(FAMIX.Attribute (id: 22)
(name 'obj_I')
(parentType (ref: 11))
(declaredType (ref: 27))
(isPrivate true)
)
(FAMIX.Attribute (id: 38)
(name 'obj_k')
(parentType (ref: 34))
(declaredType (ref: 43))
(isPrivate true)
)
(FAMIX.Attribute (id: 56)
(name 'obj_K')
(parentType (ref: 46))
(declaredType (ref: 43))
(isPrivate true)
)
(FAMIX.Attribute (id: 73)
(name 'obj_L')
(parentType (ref: 64))
(declaredType (ref: 45))
(isPrivate true)
)
(FAMIX.Attribute (id: 67)
(name 'obj_G')
(parentType (ref: 64))
(declaredType (ref: 46))
(isPrivate true)
)
(FAMIX.Attribute (id: 93)
(name 'classD')
(parentType (ref: 85))
(declaredType (ref: 94))
(isPrivate true)
)
(FAMIX.Attribute (id: 99)
(name 'classC')
(parentType (ref: 86))
(declaredType(ref: 86))
(isPackage true)
)
(FAMIX.Attribute (id: 114)
(name 'classB')
(parentType (ref: 94))
(declaredType (ref: 11))
(isPrivate true)
)
(FAMIX.Attribute (id: 107)
(name 'obj_c')
(parentType (ref: 94))
(declaredType (ref: 86))
(isPrivate true)
)
的Java代码:
// Find Attributes
Pattern p111 = Pattern.compile("FAMIX.Attribute");
Matcher m111 = p111.matcher(line);
while (m111.find()) {
FAMIXAttribute obj = new FAMIXAttribute();
Pattern p222 = Pattern.compile("id:\\s*([0-9]+)");
Matcher m222 = p222.matcher(line);
while (m222.find()) {
System.out.print(m222.group(1));
}
while ((line = br.readLine()) != null && !(line.contains("FAMIX"))) {
Pattern p333 = Pattern.compile("name\\s*'([\\w]+)\\s*'");
Matcher m333 = p333.matcher(line);
while (m333.find()) {
System.out.print(m333.group(1));
}
Pattern p555 = Pattern.compile("parentType\\s*\\(ref:\\s*([0-9]+)\\)");
Matcher m555 = p555.matcher(line);
while (m555.find()) {
System.out.print(m555.group(1));
}
Pattern p666 = Pattern.compile("declaredType\\s*\\(ref:\\s*([0-9]+)\\)");
Matcher m666 = p666.matcher(line);
while (m666.find()) {
System.out.print(m666.group(1));
}
}
} // exit from finding Attribute
输出:基于
***************** Attributes *****************
obj_k 38 34 43
obj_L 73 64 45
classD 93 85 94
classB 114 94 11
输出,问题是解析器跳过一些输出(跳转)
请让我知道如果问题不清楚,我会尽力进一步澄清。
你忘了正则表达式来检查IsPrivate
或IsPackage
部分
编辑: 有几个步骤,会告诉你什么地方出了错 添加行的打印输出,看看到底是什么线失败和模式如何看待他们
// Find Attributes
System.out.print("***"+line+"***");
Pattern p111 = Pattern.compile("FAMIX.Attribute");
Matcher m111 = p111.matcher(line);
while (m111.find()) {
的"***"
会给你确切的开始和该行的结束,关于Java的意识。 有时对于匹配器而言,看起来与眼睛相同的字符是不同的。
编辑2: 您的代码缺少外循环,其中行首次读取。 你意识到代码:
while ((line = br.readLine()) != null && !(line.contains("FAMIX"))) {
消耗,其中“FAMIX.Attribute”出现在下一行?如果你在(缺少的)外部循环中做了另一次阅读,你将会错过其他所有记录。
我不想读这个信息,我只需要名称+ ID +父类型+声明类型 – 2013-02-18 18:24:41
仍然有同样的问题。 – 2013-02-18 18:36:06
同样的问题,它仍然跳过 – 2013-02-18 18:56:42
如果您确信该文件包含的确切格式以线条为规定:
-
每个
id
,name
,parentType
,declaredType
必须完全在一行中声明。即你没有这样的输入:(FAMIX.Attribute (id: 38) (name 'obj_k') (parentType (ref: 34)) (declaredType (ref: 43)) (isPrivate true) )
但是,这是可以的:
(FAMIX.Attribute (id: 38) (name 'obj_k') (parentType (ref: 34)) (declaredType (ref: 43)) (isPrivate true))
这是先决条件低于的修改工作。 这个假设来自您当前的代码。
String line;
FAMIXAttribute obj = new FAMIXAttribute();
boolean isModified = false;
while ((line = br.readLine()) != null) {
if (line.contains("FAMIX.Attribute")) {
if (isModified) {
// TODO: Save the previous obj
obj = new FAMIXAttribute();
isModified = false;
}
}
// TODO: Add the block of code to parse id here
// TODO: Add id attribute to obj, set isModified to true
// TODO: Add the block of code to parse other stuffs here
// TODO: Add those attributes to obj, set isModified to true
}
if (isModified) {
// TODO: Save the last obj
}
仍然不工作读取许多信息.. – 2013-02-19 14:33:44
的问题是当'line'包含'FAMIX',你没救了'line'下一次运行,因此跳过了一些组。 – nhahtdh 2013-02-18 18:44:54