2013-02-18 80 views
-1

其实,我建了一个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 

输出,问题是解析器跳过一些输出(跳转)

请让我知道如果问题不清楚,我会尽力进一步澄清。

+0

的问题是当'line'包含'FAMIX',你没救了'line'下一次运行,因此跳过了一些组。 – nhahtdh 2013-02-18 18:44:54

回答

0

你忘了正则表达式来检查IsPrivateIsPackage部分

编辑: 有几个步骤,会告诉你什么地方出了错 添加行的打印输出,看看到底是什么线失败和模式如何看待他们

 // 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”出现在下一行?如果你在(缺少的)外部循环中做了另一次阅读,你将会错过其他所有记录。

+0

我不想读这个信息,我只需要名称+ ID +父类型+声明类型 – 2013-02-18 18:24:41

+0

仍然有同样的问题。 – 2013-02-18 18:36:06

+0

同样的问题,它仍然跳过 – 2013-02-18 18:56:42

0

如果您确信该文件包含的确切格式以线条为规定:

  • 每个idnameparentTypedeclaredType必须完全在一行中声明。即你没有这样的输入:

    (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 
} 
+0

仍然不工作读取许多信息.. – 2013-02-19 14:33:44