我看不出有什么办法可以完全避免编写正则表达式并将它们应用到这些文本文件的行中。 (没有关于定义配置文件数据的整体语法的指示,根据那个语法编写解析器会 - 很可能 - 很难,没有机会?)
我看到两个问题需要解决。一个是对特定关键字(例如“主机名”)的识别,另一个是根据一个或多个先前行,是否存在某些模式。
要解决第一个问题,我会(使用Java代码)将行分隔成空格分隔的标记,以便每行都变为List。
第二个问题可以使用规则进行攻击。
rule "hostname"
when
Line($n: number, $tok: tokens contains "hostname")
eval($tok.get($tok.indexOf("hostname") + 1).length() > 4) // incomplete
then
insert(new Correct($n, "hostname"));
end
(请注意,布尔表达式必须警惕$托克与“主机名”的结局。)插入事实正确数据比对所有失败的情况下写规则更容易。最后会有另一套规则检查所有需要的正确事实是否在工作记忆中。另外,可能需要检查重复的“主机名”定义,这可以使用正确的事实轻松完成。
我们来看另一个例子。
rule "interface"
when
Line($n1: number, $tok: tokens contains "interface")
Line(number == $n1 + 1, tokens not contains "disabled")
Line(number == $n1 + 2,
tokens not contains "parameter" ||
tokens contains "parameter" && $tok.indexOf("parameter") < $tok.size() - 1)
then
insert(new Error($n1, "interface configuration error"));
end
会不会是$ tok.indexOf( “参数”)== 1和$ tok.size()== 2是必需的,但不知道这些要求的确切性质......在这里我m插入一个否定结果,也可以在最后收集它,按行号排序等。
最后一点:我觉得这些验证要求的措词太朦胧,除非您有信心更严格的处理器能够处理不良的语法,或者规范实际上容忍奇怪的措辞,例如,例如 “主机名土星没有他的戒指;-)” 这是一个正确的线?它通过根据您的规则的测试...
这是大部分配置验证。每个系统必须有一个'主机名xxxx'行,xxx必须大于4个字符。找到'接口',如果下一行不包含'disabled','description'这个单词必须存在于下面一行中,并带有参数....就像一组示例 – awm