2

我想从字符串中删除不在列表中的单词。

例如,我有字符串“我喜欢馅饼和蛋糕”或“馅饼和蛋糕很好”,我想删除不是“馅饼”或“蛋糕”的词,并以字符串“馅饼蛋糕”结尾。

如果可以从表中加载它不删除的单词,那就太好了。

4

3 回答 3

4

这是另一种解决方案,但您可能需要修剪结果中的最后一个空格。

acceptable = { "pie", "cake" }
for k,v in ipairs(acceptable) do acceptable[v]=v.." " end
setmetatable(acceptable,{__index= function () return "" end})

function strip(s,t)
    s=s.." "
    print('"'..s:gsub("(%a+) %s*",t)..'"')
end

strip("i like pie and cake",acceptable)
strip("pie and cake is good",acceptable)

gsub是这里的重点。使用 and 函数还有其他变体gsub,而不是为acceptable.

于 2013-05-12T00:23:21.453 回答
3
local function stripwords(inputstring, inputtable)
  local retstring = {}
  local itemno = 1;
  for w in string.gmatch(inputstring, "%a+") do
     if inputtable[w] then
       retstring[itemno] = w
       itemno = itemno + 1
     end
  end

  return table.concat(retstring, " ")
end

前提是您要保留的单词都是inputtable.

于 2013-05-11T22:36:41.413 回答
0

以下还实现了请求的最后一部分(我希望):

如果可以从表中加载它不删除的单词,那就太好了。

function stripwords(str, words)
    local w = {};
    return str:gsub("([^%s.,!?]+)%s*", function(word)
        if words[word] then return "" end
        w[#w+1] = word
    end), w;
end

请记住,Lua 的模式匹配器与多字节字符串不兼容。这就是我使用上述模式的原因。如果您不关心多字节字符串,则可以使用类似"(%a+)%s". 在那种情况下,我也会通过这些话string.upper

测试/使用

local blacklist = { some = true, are = true, less = true, politics = true }
print((stripwords("There are some nasty words in here!", blacklist)))

local r, t = stripwords("some more are in politics here!", blacklist);
print(r);
for k,v in pairs(t) do
    print(k, v);
end
于 2013-05-13T12:59:49.037 回答