我想从字符串中删除不在列表中的单词。
例如我有字符串“我喜欢馅饼和蛋糕”或“馅饼和蛋糕很好”我想要删除不是“馅饼“或”蛋糕“并以”馅饼蛋糕“字符串结尾。
如果可以从表中加载不删除的单词,那就太棒了。
答案 0 :(得分: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
是关键点。使用gsub
和函数还有其他变体,而不是为acceptable
设置元表。
答案 1 :(得分: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
。
答案 2 :(得分: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