Java 解析Cisco路由器配置块

Java 解析Cisco路由器配置块,java,parsing,cisco,Java,Parsing,Cisco,我正在尝试解析cisco配置。它具有如下所示的缩进结构。有很多像这样的街区。有些街区可能更长符号表示上述缩进的结束。如何分析块和块下的子块 例1: XXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX \ XXXXXXXXXXXX \ | XXXXXX | sub-block | block XXXXXX

我正在尝试解析cisco配置。它具有如下所示的缩进结构。有很多像这样的街区。有些街区可能更长<代码>符号表示上述缩进的结束。如何分析块和块下的子块

  • 例1:

    XXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX                \          
      XXXXXXXXXXXX    \              |         
        XXXXXX         | sub-block   | block
        XXXXXX         |             |         
      !               /              |         
    !                               /        
    XXXXXXXXXXXXX
    XXXXXXXXXXXXX
    XXXXXXXXXXXX
    XXXXXX
    
  • 例2:

    XXXXXXXXXXX
    XXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXX               \       
        XXXXXXXXXXXX  \             |      
            XXXXXX     | sub-block  | block
            XXXXXX     |            |      
        !             /             |      
        XXXXXXXXXXXX  \             |       
            XXXXXX     | sub-block  |
        !             /             |
    !                              /
    XXXXXXXXXXXXX
    XXXXXXXXXXXXX
    XXXXXXXXXXXX
    XXXXXX
    
  • Ex3-真正的Cisco配置:

    vrf myvrfvir
      address-family ipv4 broadcast
        import route
          10:10
        !
        export route
          20:20
        !
      !
    !
    interface Eth6/3/9/4.10
      description vlan10
      mtu 1500
      dot1q vlan 10
    !
    .
    .
    .
    
    共有4个街区:

    • 第一个块名是
      vrf myvrfvir
    • 第二个块名是
      接口GigabitEth0/3/5/3.10
    • 第三(子)块是导入路径
    • 第四(子)块是导出路径
      
      
    所以我希望能够得到所有的块,并将它们存储在哈希、列表、文本或

    所以我想在需要的时候用它的块和上面的块名来访问每个块


最简单的方法是在地图中存储块数据:

class Block {
    private Map<String, String> data;
    private Block parent;
    private List<Block> children;
}

我不知道当你按照你的解释(为了清楚起见,我已经重构了一点)发布这篇文章时,你在想什么,
地址族ipv4广播
也应该是一个块?
    try (BufferedReader bufferedReader = new BufferedReader(reader)) {
        Block block = new Block();
        String line, previousIndents = "";
        while (null != (line = bufferedReader.readLine()) {
            Matcher m = Pattern.compile("^(\\s+)").matcher(line);
            if (m.find()) {
                String indents = m.group(1);
                if (previousIndents.equals(indents)) {
                     // update current block
                } else if (indents.length() > previousIndents.length()) {
                     // start a new block
                     Block newBlock = new Block();
                     newBlock.setParent(block);
                     block.getChildren().add(newBlock);

                     block = newBlock;
                } else {
                     // current block finished, return to parent
                     block = block.getParent();
                }

                previousIndents = indents;
            }
        } 
    }
    catch (IOException ioEx) {
        throw new ParseException(ioEx);
    }