Lua:在长字符串中快速多次替换

时间:2018-11-16 04:37:30

标签: string replace lua

我有

  • 模式/替换对的列表。
  • 要替换的长字符串(几个kByte甚至MBytes)。

所有模式的所有出现都必须用其对应的替换文本替换。每个模式在字符串中可能不止一次存在。

当前,我通过遍历模式/替换对列表并每次使用string.gsub来做到这一点:

for _, pattern, replace in iter(replace_patterns) do
  body = body:gsub(pattern, replace)
end

({iter是一个帮助程序,可以更好地遍历模式。)

问题:这是最好的方法吗?我担心这样做效率低下,因为每次调用gsub都会扫描整个长字符串。

P.S。我读了https://stackoverflow.com/a/12865406/5005936(帮助我减少了字符串使用量和其他用法)和https://stackoverflow.com/a/38422229/5005936(但我不想在这种情况下编写本机代码...)

1 个答案:

答案 0 :(得分:0)

您可能想尝试的事情(您必须在字符串上运行一些基准测试以查看最有效的方法):

  1. 使用find代替gsub,因为它占据起始位置,这样可以避免为每个模式重新扫描相同的(长)字符串
  2. 使用table.concat将最终字符串连接在一起;本质上,使用find来获取替换开始处的位置,并剪切(子)字符串以在表中填充替换及其之间的字符串。然后将结果连接在一起以获取所需的字符串。

您将必须运行测试,因为在不知道模式数量和每种模式的大概替换数量的情况下很难给出一些合理的建议。