2016-10-31 6 views
-1

シスコの設定を解析しようとしています。それは以下のようにインデントされた構造を持っています。このようなブロックがたくさんあります。いくつかのブロックは長くすることができます。 !記号は上のインデントの終わりを意味します。ブロックの下にあるブロックとサブブロックをどのように解析できますか?シスコのルータ設定ブロックの解析

  • Ex1の:

    XXXXXXXXXXX 
    XXXXXXXXXXXXXXXX 
    XXXXXXXXXXXXXXXX    \   
        XXXXXXXXXXXX \    |   
        XXXXXX   | sub-block | block 
        XXXXXX   |    |   
        !    /   |   
    !        /  
    XXXXXXXXXXXXX 
    XXXXXXXXXXXXX 
    XXXXXXXXXXXX 
    XXXXXX 
    
  • Ex2の:

    XXXXXXXXXXX 
    XXXXXXXXXXXXXXXX 
    XXXXXXXXXXXXXXXX    \  
        XXXXXXXXXXXX \    |  
         XXXXXX  | sub-block | block 
         XXXXXX  |   |  
        !   /   |  
        XXXXXXXXXXXX \    |  
         XXXXXX  | sub-block | 
        !   /   | 
    !       /
    XXXXXXXXXXXXX 
    XXXXXXXXXXXXX 
    XXXXXXXXXXXX 
    XXXXXX 
    
  • Ex3を - 実シスコ設定:

    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
    • 第二のブロック名がinterface GigabitEth0/3/5/3.10
    • 3(サブ)であるブロックは、
    • 4(サブ)ブロックexport routeで、import routeあります。

    ので、私は必要なときに私はそのブロックと上ブロック名と、各ブロックに到達したいすべてのブロックを取得し、ハッシュ、リスト、テキストや...

    に保存できるようにしたいです。

+1

私はあなたの説明に続いて、この – Treycos

+0

を投稿するとき(私はわかりやすくするためにビットをリファクタリングしていることを)あなたの心を通過したかについては考えている、 'アドレスファミリのIPv4 broadcast'は、ブロックすべきですか? – Seki

答えて

2

最も簡単なマップに格納するブロックデータに次のようになります。

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

また、あなたは/あなたのニーズに合ったお手元に持っているタスクを解決し、別のデータ構造を作成することができます。

次に、ファイルを1行ずつ読み込み、必要なインデント数を追跡​​して新しいブロックが必要かどうかを検出し、上にデータ構造を設定します。

クイックで汚れたサンプル(免責事項:私はこのコードを実行しませんでした。これはあなたが開始したばかりで、バリデーションを追加し、複数の関数などに分割して、きれいで、正確で、 :

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); 
    } 
関連する問題