我看不出有什麼辦法可以完全避免編寫正則表達式並將它們應用到這些文本文件的行中。 (沒有關於定義配置文件數據的整體語法的指示,根據那個語法編寫解析器會 - 很可能 - 很難,沒有機會?)
我看到兩個問題需要解決。一個是對特定關鍵字(例如「主機名」)的識別,另一個是根據一個或多個先前行,是否存在某些模式。
要解決第一個問題,我會(使用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