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
哈希符号,而在我的例子中只有一个。
我假设字符串本身不包含模式。
如果需要,可以解决这两个问题。
我有 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
哈希符号,而在我的例子中只有一个。我假设字符串本身不包含模式。
如果需要,可以解决这两个问题。