2015-04-03 81 views
2

我有抓住外圍類型的列表,匹配他們看看他們是否有效的類型,然後它們是否有效執行特定類型的代碼的程序。如何使用模式,以縮短僅匹配字符串

但是,有些類型可以共享部分名稱,唯一不同的是它們的層次,我想將它們與有效外設列表中列出的基類型進行匹配,但我無法弄清楚使用模式來匹配它們,而不會返回nil的模式,但不匹配所有內容。

這裏是爲了證明我的問題代碼:

connectedPeripherals = { 
    [1] = "tile_thermalexpansion_cell_basic_name", 
    [2] = "modem", 
    [3] = "BigReactors-Turbine", 
    [4] = "tile_thermalexpansion_cell_resonant_name", 
    [5] = "monitor", 
    [6] = "tile_thermalexpansion_cell_hardened_name", 
    [7] = "tile_thermalexpansion_cell_reinforced_name", 
    [8] = "tile_blockcapacitorbank_name" 
} 

validPeripherals = { 
    ["tile_thermalexpansion_cell"]=true, 
    ["tile_blockcapacitorbank_name"]=true, 
    ["monitor"]=true, 
    ["BigReactors-Turbine"]=true, 
    ["BigReactors-Reactor"]=true 
} 

for i = 1, #connectedPeripherals do 

    local periFunctions = { 
     ["tile_thermalexpansion_cell"] = function() 
      --content 
     end, 
     ["tile_blockcapacitorbank_name"] = function() 
      --content 
     end, 
     ["monitor"] = function() 
      --content 
     end, 
     ["BigReactors-Turbine"] = function() 
      --content 
     end, 
     ["BigReactors-Reactor"] = function() 
      --content 
     end 
    } 

    if validPeripherals[connectedPeripherals[i]] then periFunctions[connectedPeripherals[i]]() end 
end 

如果我嘗試這樣運行它,所有的thermalexpansioncells不能被識別爲有效外設,如果我添加匹配的語句模式,它適用於thermalexpansioncells,但對於其他任何情況返回nil並導致異常。

我怎麼做一個匹配語句只返回匹配的事情縮短字符串,返回的東西,不要原始字符串?

這可能嗎?

回答

2

如果短版不包含任何特殊字符從Lua模式,你可以使用以下命令:

long = "tile_thermalexpansion_cell_basic_name" 

result = long:match("tile_thermalexpansion_cell") or long 
print(result) -- prints the shorter version 

result = long:match("foo") or long 
print(result) -- prints the long version 
+2

您也可以使用該方法調用語法甚至更短,更可讀的代碼,例如:結果=長:比賽(「富」)或長 – tonypdmtr 2015-04-03 13:33:36

+0

@tonypdmtr是這好得多:) – ryanpattison 2015-04-03 13:35:23

1

基於the comment,您還可以使用string.find看到類型匹配的外設名稱:

for i,v in ipairs(connectedPeripherals) do 
    local Valid = CheckValidity(v) 
    if Valid then Valid() end 
end 

其中,CheckValidity將從validPeripherals返回鍵:

function CheckValidity(name) 
    for n, b in pairs(validPeripherals) do 
     if name:find(n) then return n end 
    end 
    return false 
end 
+0

我不能手動指定connectedPeripherals'的'內容那樣,我只能這樣做,爲示範的目的,但實際的程序中,該表將自動填充,每次程序運行時可以是不同的。 'connectedPeripherals'由一個'peripherals.getNames()'方法填充,該方法自動用連接的外設名稱填充表,所以我不能在其中創建一個哈希表,而沒有其他改變表的內容,我不知道如何做到這一點。 – 2015-04-03 08:58:25

+0

@MarkKramer更新答案 – hjpotter92 2015-04-03 09:08:25