我有一个字符串表:
self.rooms = { "n", "s", "e", "w", "nw", "ns", "ne", "sw", "se", "ew", "nsw", "nse", "swe", "nwe", "nsew" }
然后我得到一个字符串,它将包含这些字符串的任意组合,我希望在上表中找到包含任何顺序字母的字符串。
所以,如果我有一个字符串" es"然后我应该回来了:
" se"," nse"," nsew"," swe"因为他们都有字母' e' AND' s'在他们中间。
有没有匹配可以做到这一点?
答案 0 :(得分:2)
试试这个:
rooms = { "n", "s", "e", "w", "nw", "ns", "ne", "sw", "se", "ew", "nsw", "nse", "swe", "nwe", "nsew" }
function normalize(s)
local t=""
if s:match("n") then t=t.."n"..".*" end
if s:match("s") then t=t.."s"..".*" end
if s:match("e") then t=t.."e"..".*" end
if s:match("w") then t=t.."w" end
return t
end
p = normalize("es")
for i,v in ipairs(rooms) do
if v:match(p) then print(v) end
end
答案 1 :(得分:1)
我试图找到任何字母组合的解决方案,但必须遵守样本中每个字母的强制要求:
local rooms = { "n", "s", "e", "w", "nw", "ns", "ne", "sw", "se", "ew", "nsw", "nse", "swe", "nwe", "nsew" }
function MyFind (inp, str)
if str=="" then return false end
local found=true
string.gsub(str, '.', function (c) -- this code can be replaced with a 'for' loop
if inp:find(c) and found then found=true else found=false end
end)
return found ,inp
end
local chars = "se" -- 1,2,3.. or more letters
for _,v in pairs(rooms) do
a,b = MyFind (v, chars)
if a then print (b) end
end
打印:
se
nse
swe
nsew