2010-08-11 110 views
0

首先,我一直在使用這個站點作爲整個腳本編寫過程的參考,它很棒。我很欣賞每個人都在這裏的有用和知識。考慮到這一點,我有一個關於Lua中匹配(模式匹配)的問題。我正在編寫一個腳本,它基本上從文件輸入並將其導入到表中。我正在檢查文件中的特定MAC地址,作爲我正在查詢的主機。Lua腳本模式匹配問題

if macFile then 
    local file = io.open(macFile) 

    if file then 
    for line in file:lines() do 
     local f = line 
     i, j = string.find (f, "%x+") 
     m = string.sub(f, i, j) 
     table.insert(macTable, m) 
    end 
    file:close() 
    end 

這將文件解析成我將用於稍後查詢的格式。一旦該表建成後,我運行模式匹配序列,試圖通過遍歷表和匹配針對當前迭代的方式從表中匹配MAC:

local output = {} 
t = "00:00:00:00:00:00" 
s = string.gsub(t, ":", "") 
for key,value in next,macTable,nil do 
     a, p = string.find (s, value) 
     matchFound = string.sub(s, a, p) 
     table.insert(output, matchFound) 
end 

這不會返回儘管當任何輸出我在Lua提示符中逐行輸入它,它似乎工作。我相信變量正確傳遞。有什麼建議麼?

+0

什麼'macFile'的內容是什麼? – gwell 2010-08-11 15:58:26

回答

2

如果您macFile使用這樣的結構:


008967452301 
000000000000 
ffffffffffff 

下面的腳本應該工作:

macFile = "./macFile.txt" 
macTable = {} 

if macFile then 
    local hFile = io.open(macFile, "r") 
    if hFile then 
     for line in hFile:lines() do 
      local _,_, sMac = line:find("^(%x+)") 
      if sMac then 
       print("Mac address matched: "..sMac) 
       table.insert(macTable, sMac) 
      end 
     end 
     hFile:close() 
    end 
end 

local output = {} 
t = "00:00:00:00:00:00" 
s = string.gsub(t, ":", "") 

for k,v in ipairs(macTable) do 
    if s == v then 
     print("Matched macTable address: "..v) 
     table.insert(output, v) 
    end 
end 
+0

非常感謝你們。亞當,那正是我所尋找的。它看起來不像簡單的平等條件那麼簡單。我感謝你的時間。 – Timothy 2010-08-12 23:12:32

0

我剛剛離開工作,現在無法深入瞭解您的問題,但接下來的兩行看起來很奇怪。

t = "00:00:00:00:00:00" 
s = string.gsub(t, ":", "") 

基本上你是字符串t中刪除所有':'字符。之後,您最終得到s"000000000000"。這可能不是你想要的?

+0

那麼,我輸入的MAC文件基本上是一行一行,沒有「:」的Mac。所以我的桌子上充滿了許多不同的條目,全部格式化爲「:」。所以,爲了匹配表格格式,我需要格式化t。然而,在腳本中,變量t將被自動填充。但謝謝你的回信! – Timothy 2010-08-11 19:18:54

+0

您是否驗證過能正確解析文件?您可以通過執行'for k,v(macTable)do print(k,v)end'來測試它。你能發佈你想分析的文件的一部分嗎? – ponzao 2010-08-12 07:02:12