我有一个程序可以获取外围类型列表,匹配它们以查看它们是否是有效类型,然后执行类型特定代码(如果它们有效)。
但是,有些类型可以共享其名称的一部分,唯一的区别是它们的层,我想将这些匹配到有效外设表中列出的基本类型,但我无法弄清楚如何使用模式匹配它们,而不会为不匹配的所有内容返回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并导致异常。
如何执行匹配语句,该匹配语句仅为匹配的内容返回缩短的字符串,并返回原始字符串以查找不匹配的内容?
这可能吗?
答案 0 :(得分: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
答案 1 :(得分: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