【问题标题】:Lua: Doing fast multiple replacements in long stringsLua:在长字符串中进行快速多次替换
【发布时间】:2019-04-19 06:25:14
【问题描述】:

我有

  • 模式/替换对列表。
  • 用于替换的长字符串(数 kByte 甚至 MBytes)。

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

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

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

iter 是一个辅助函数,可以更好地遍历模式。)

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

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

【问题讨论】:

  • 你看过LPeg吗?它速度很快,并且只允许您扫描一次字符串。

标签: string replace lua


【解决方案1】:

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

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

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

【讨论】:

  • 如何避免为每个模式再次扫描整个字符串? find 只能搜索一种模式,不是吗?我错过了什么?
  • 做一些性能测试是个好主意:我得到的结果是,对于长度为 1 MByte 和 8 个模式(典型最大值)的字符串,我的替换大约需要 100 毫秒。事实证明,时间随着字符串长度和替换模式的数量线性增加(如预期的那样)。
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多