我有4个非常大的表,包括字符串,每个表都有一千个项目。我需要做的是遍历每个表,并在表格中的每个字符串的大字符串上进行gsub。
这可以解释:
for index, str in pairs(firstTable) do
text = text:gsub("%f[%a]"..str.."%f[%A]", "#"..str);
end
for index, str in pairs(secondTable) do
text = text:gsub("%f[%a]"..str.."%f[%A]", "#"..str);
end
for index, str in pairs(thirdTable) do
text = text:gsub("%f[%a]"..str.."%f[%A]", "#"..str);
end
for index, str in pairs(fourthTable) do
text = text:gsub("%f[%a]"..str.."%f[%A]", "#"..str);
end
有可能我能以某种方式减轻压力吗?目前,当文本非常大时,它会导致大量滞后。感谢。
答案 0 :(得分:2)
您可以创建一个包含所有需要替换的字符串的查找表,然后在一个gsub调用中执行所有替换。缺点是如果四个大表的内容发生变化,您将需要更新查找表。以下是创建查找表的方法:
local lookup = {}
for index, str in pairs(firstTable) do
lookup[str] = "#" .. str
end
for index, str in pairs(secondTable) do
lookup[str] = "#" .. str
end
for index, str in pairs(thirdTable) do
lookup[str] = "#" .. str
end
for index, str in pairs(fourthTable) do
lookup[str] = "#" .. str
end
这就是你要做的替换:
text = text:gsub("%f[%a]%a+%f[%A]", lookup)
这应该比你的解决方案快得多,因为它只扫描一个非常大的字符串而不是4000次。角落情况会产生与您的解决方案不同的结果:
我假设四个表中的字符串是唯一的;否则,如果一个字符串出现n
次,那么它将在您的情况下加上n
个哈希符号,并且只有我的一个。
我假设字符串本身不包含模式。
如果需要,可以修复这两个问题。