我正尝试在字符串中搜索一组值,然后仅在字符串与一组值完全匹配时才返回该值。
我的原始表情是这样的:
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"
。
我知道它可能非常简单和明显,但是我似乎找不到解决方案,因此非常感谢您的帮助!
答案 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上的资源:
答案 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)
希望这会有所帮助。