如何使用模式缩短匹配的字符串

时间:2015-04-03 08:27:47

标签: lua lua-table lua-patterns

我有一个程序可以获取外围类型列表,匹配它们以查看它们是否是有效类型,然后执行类型特定代码(如果它们有效)。

但是,有些类型可以共享其名称的一部分,唯一的区别是它们的层,我想将这些匹配到有效外设表中列出的基本类型,但我无法弄清楚如何使用模式匹配它们,而不会为不匹配的所有内容返回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 个答案:

答案 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