Lua: string.gsub 循环中的模式滞后

Lua: string.gsub pattern in a loop lags

我有 4 个非常大的 table 由字符串组成,每个都有一千个项目。我需要做的是循环遍历每个 table,并在一个大字符串上使用 gsub,每个字符串都在 table.

这可以解释:

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

有什么办法可以减轻我的压力吗?目前,当文本非常大时,它会导致大量延迟。谢谢

您可以创建一个查找 table 所有需要替换的字符串,然后在一次 gsub 调用中完成所有替换。缺点是如果四个大 table 的内容发生变化,您将需要更新查找 table。以下是创建查找 table:

的方法
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 次。这会产生与您的解决方案不同的结果的极端情况:

  • 我假设四个 table 中的字符串是唯一的;否则,如果一个字符串出现 n 次,它会在你的例子中加上 n 哈希符号,而在我的例子中只有一个。

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

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