Lua:在长字符串中进行快速多个替换

我有一个

  • 一组模式/替换对
  • 一个要进行替换的长字符串(几千字节甚至几兆字节)。

所有模式的所有出现都必须被它们对应的替换文本替换。每个模式在字符串中可能存在多次。

目前,我通过迭代模式/替换对列表并每次使用 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(但我不想在此上下文中编写本地代码...)

点赞
用户1442917
用户1442917

以下是你可能想要尝试的一些事情(你将不得不在你的字符串上运行一些基准测试,以查看哪种方法最好):

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

你将不得不运行测试,因为不知道模式的数量和每个模式的替换大约有多少,难以给出一些合理的建议。

2018-11-16 05:35:43