我正在尝试解析cisco配置。它具有如下所示的缩进结构。有很多像这样的街区。有些街区可能会更长。 !
符号表示上面缩进的结尾。我如何解析块下的块和子块?
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
,import route
,export route
。 所以我希望能够获取所有块并将它们存储在哈希,列表,文本或......中。
所以我想在需要的时候用它的块和上块名称来到达每个块。
答案 0 :(得分:2)
最简单的方法是将块数据存储在地图中:
class Block {
private Map<String, String> data;
private Block parent;
private List<Block> children;
}
此外,您可以创建另一个适合您需求的数据结构/解决您手头的任务。
然后,只需逐行读取文件,通过跟踪您拥有的缩进数来检测是否需要新块,并填充上面的数据结构。
快速而肮脏的样本(免责声明:我没有运行此代码,只是为了让您入门,您应该添加验证,将其拆分为多个功能等等,以便它干净,正确,好读()
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);
}