Lua:循环中的string.gsub模式延迟

我有4个非常大的字符串表,每个表都有约1000个项目。我需要做的是循环遍历每个表,并使用表中的每个字符串对大字符串进行 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

是否有可能让它变得不那么紧张?当文本非常大时,目前会导致严重的延迟。谢谢。

点赞
用户2733013
用户2733013

你可以创建一个查找表来存储所有需要替换的字符串,然后一次性使用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个哈希符号,在我的解决方案中只会添加一个。

  • 我假设字符串本身不包含模式。

如果需要,这两个问题都可以解决。

2015-02-17 11:01:34