我有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
有没有办法我可以减轻压力呢?当前,当文本很大时,它会导致大量的延迟。谢谢。
您可以创建一个需要替换的所有字符串的查找表,然后在一个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
在您的情况下,该字符串将以井号开头,而在我的情况下仅以一个。
我假设字符串本身不包含模式。
如果需要,可以解决这两个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句