我该如何在Lua中找到由关键字中的字母组成的单词?

例如,我有一个关键词"abandoned",我想从我存储的单词数组中找到包含此关键词字母的单词,如"done"、"abandon"、"band"等。我该如何搜索呢?

我尝试编写了以下代码,但并未正常工作。我编写了一个函数,该函数接受关键词和单词作为参数。然后我将关键词的每个字母放入keywordletters数组中,将单词的每个字母放入wordletters数组中。

然后我编写了一个循环来匹配字母。如果wordletters数组与keywordletters数组的字母匹配,则我将当前wordletters元素设置为nil,然后将keywordletters元素设置为nil。因为我们不能第二次使用它。

在所有循环之后,我检查了wordletters数组。如果有一个元素不为nil,则返回false。但是,它没有按照我想要的方式工作。你能帮帮我吗?

编辑:我解决了我的问题,并相应地编辑了代码。

以下是我的代码:

  function consistLetters(keyword,word)

keywordletters={ }
    wordletters= { }
local found=false
findLetters(keyword,keywordletters)
findLetters(word,wordletters)

for i=1, #wordletters,1 do
    for j=1, #keywordletters,1 do
        if(keywordletters[j]~="") then
            if(wordletters[i]==keywordletters[j]) then
                keywordletters[j]=""
                found=true;
                break
            end
         end
    end
    if found~=true then
        return false
    end
   found=false;
end

return true

  end
点赞
用户107090
用户107090

尝试一下:

W={"done", "abandon", "band"}
for k,w in pairs(W) do
    W[w]=true
end

function findwords(s)
    for i=1,#s do
        for j=i+1,#s do
            local w=s:sub(i,j)
            if W[w] then print(w) end
        end
    end
end

findwords("abandoned")

如果您没有单词数组,可以加载一个字典:

for w in io.lines("/usr/share/dict/words") do
    W[w]=true
end
2012-06-26 12:14:11
用户936986
用户936986

在数组上运行循环,并使用 string.find 对比这个长字符串。

for idx = 1, #stored_words do
   local word = stored_words[idx]
   if string.find(long_word, word, 1, true) then
      print(word .. " matches part of " .. long_word)
   end
end
2012-06-26 12:14:47
用户501459
用户501459

例如,我有一个关键词“abandoned”,我想找到包含该关键词字母如“done”,“abandon”,“band”等单词,从我存储这些单词的数组中搜索它。我该如何搜索呢?

你可以将关键字简单地用作正则表达式(在Lua中称为“pattern”),将其字母作为集合,例如('^[%s]+$'):format('abandoned'):match('done')

local words = {'done','abandon','band','bane','dane','danger','rand','bade','rand'}
local keyword = 'abandoned'

-- 将关键字转换为模式并将其与每个单词匹配
local pattern = string.format('^[%s]+$', keyword)
for i,word in ipairs(words) do
    local matches = word:match(pattern)
    print(word, matches and 'matches' or 'does not match')
end

输出:

done    matches
abandon matches
band    matches
bane    matches
dane    matches
danger  does not match
rand    does not match
bade    matches
rand    does not match
2012-06-26 18:52:03