在字符串Lua中搜索一组定义的值

时间:2019-06-27 14:08:53

标签: string lua match

我正尝试在字符串中搜索一组值,然后仅在字符串与一组值完全匹配时才返回该值。

我的原始表情是这样的:

title = "MrS"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = (title:gsub("%w",string.lower)):gsub("^l", string.upper)

if string.match(title, setTitles) ~= nil then title = title else title = "XX" end

然后我意识到我需要一些循环遍历值的方法,所以到了这里:

title = "MrS"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = (title:gsub("%w",string.lower)):gsub("^%l", string.upper)

for i = 1, 5 do
  if string.match(title, setTitles[i]) ~= nil 
    then title = title 
  else title = "XX" 
  end
end

除了每次只会返回"XX"

我知道它可能非常简单和明显,但是我似乎找不到解决方案,因此非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这就是为什么您的代码无法正常工作的原因。循环的第一次迭代使用{"type":"application/octet-stream","length":1000,"contents":"asf","name":"xx.txt"} 并检查它是否与Mrs匹配,并且不会,因此将标题更改为 Miss,因此以下任何检查都不能曾经的比赛。

您必须先检查所有可能的值,然后才能更改标题。 通过调整代码以使用XX变量来确定是否需要更改,您可以解决此问题:

matchFound

另外,您的代码可以为local matchFound = false for i = 1, 5 do if string.match(title, setTitles[i]) ~= nil then matchFound = true break end end if matchFound == false then title = "XX" end print(title) 给出错误的匹配,而不是Mr,这是因为Mrs将在Mr或任何以Mrs开头的字符串中匹配。要更改此设置,您可以将string.match的调用调整为:

Mr

这会强制string.match(title, "^".. setTitles[i] .. "$") 确保模式的第一个和最后一个字符也是传递给它的字符串的第一个和最后一个字符。


建议,而不要使用string.match,将string.match设置为合适的集合,例如:

setTitles

然后您的支票变成:

local setTitles = {["Miss"] = true, ["Mr"] = true, ["Mrs"] = true, ["Dr"] = true, ["Ms"] = true}

Lua上的资源:

https://www.lua.org/pil/11.5.html

http://lua-users.org/wiki/SetOperations

答案 1 :(得分:1)

您不应在for循环中更改title变量。

您可以尝试以下代码:

--title = "MrS"
title = "MrX"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = title:gsub("%w", string.lower) -- mrs
title = title:gsub("^%l", string.upper) -- Mrs

ismatch = false

for i = 1, 5 do

    print(title, setTitles[i])

    if tostring(title) == tostring(setTitles[i]) then
        ismatch = true
        print("matched")
        return
    end

end

if ismatch then title = title else title = "XX" end
print(title)

希望这会有所帮助。