在Lua中修改字符串中的字符

2023-11-21

有什么办法可以替换Lua中字符串中第N位的字符。

这是我到目前为止所想出的:

function replace_char(pos, str, r)
    return str:sub(pos, pos - 1) .. r .. str:sub(pos + 1, str:len())
end

str = replace_char(2, "aaaaaa", "X")
print(str)

我也不能使用 gsub,因为这会替换每个捕获,而不仅仅是位置 N 处的捕获。


Lua 中的字符串是不可变的。这意味着,任何替换字符串中文本的解决方案最终都必须构造一个具有所需内容的新字符串。对于用其他内容替换单个字符的特定情况,您需要将原始字符串拆分为前缀部分和后缀部分,然后将它们重新连接到新内容周围。

您的代码的这种变化:

function replace_char(pos, str, r)
    return str:sub(1, pos-1) .. r .. str:sub(pos+1)
end

是对简单 Lua 最直接的翻译。对于大多数用途来说,它可能足够快了。我已经修复了前缀应该是第一个的错误pos-1字符,并利用了这样一个事实:如果最后一个参数string.sub缺少它被认为是-1这相当于字符串的结尾。

但请注意,它会创建许多临时字符串,这些字符串将在字符串存储中徘徊,直到垃圾收集将其吃掉。在任何解决方案中都无法避免前缀和后缀的临时性。但这也必须为第一个创建一个临时的..由第二个操作符消耗。

两种替代方法中的一种可能会更快。第一个是Paŭlo Ebermann 提供的解决方案,但有一个小调整:

function replace_char2(pos, str, r)
    return ("%s%s%s"):format(str:sub(1,pos-1), r, str:sub(pos+1))
end

这使用string.format对结果进行组装,希望它能够猜测最终的缓冲区大小,而不需要额外的临时对象。

但请注意string.format可能有任何问题\0它通过的任何字符串中的字符%s格式。具体来说,由于它是按照标准 C 实现的sprintf()函数,期望它在第一次出现时终止替换字符串是合理的\0。 (用户注意到妄想逻辑在评论中。)

我想到的第三种选择是:

function replace_char3(pos, str, r)
    return table.concat{str:sub(1,pos-1), r, str:sub(pos+1)}
end

table.concat有效地将字符串列表连接成最终结果。它有一个可选的第二个参数,它是要在字符串之间插入的文本,默认为""这符合我们的目的。

我的猜测是,除非您的字符串很大并且经常进行这种替换,否则您不会看到这些方法之间有任何实际的性能差异。然而,我之前就感到惊讶,因此分析您的应用程序以验证是否存在瓶颈,并仔细对潜在的解决方案进行基准测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Lua中修改字符串中的字符 的相关文章

随机推荐

  • 简单的 PIN 验证

    任务 ATM 机允许使用 4 或 6 位 PIN 码 并且 PIN 码只能包含 4 位或 6 位数字 如果函数传递了有效的 PIN 字符串 则返回 true 否则返回 false 我的解决方案 function validatePIN pi
  • 在 flutter 中使用 image.asset 时图像质量下降

    我有一个 png 的用户 Image asset 但我注意到该图像质量较差 如何在真实设备中保持相同的质量 就我而言 问题是由于图像分辨率系统的配置错误造成的 一方面 您必须在资产文件夹中指定不同的分辨率 assets my icon pn
  • 如何在 .NET 格式字符串中转义大括号(大括号)

    使用时如何转义括号string Format 例如 String val 1 2 3 String Format foo 0 val 此示例不会引发异常 但会输出字符串foo 0 有没有办法摆脱括号 供你输出 foo 1 2 3 你必须做类
  • Rails 4.0 上的 haml-rails?

    我想知道是否有人遇到过任何障碍haml railsRails 4 0 中的 gem 有一个导轨铸件这表明存在一些问题 但没有更多提及这一点 GitHub 上托管的 gem 也没有明确提及对 Rails 4 0 的支持 那么这方面的现状如何呢
  • Android:使用SimpleCursorAdapter从数据库获取数据到ListView

    我正在编写一个 Android 应用程序 它应该使用数据库来存储数据并从中读取数据 使用本教程 在 archive org 上 我得到了创建数据库的应用程序 并且能够创建新条目 但是 我不知道如何读取数据库以获取 ListView 中存储的
  • jquery 验证 onclick

    我对 jquery 验证插件有一个问题 这对我来说没有意义 请问有人能看出我的错误在哪里吗 这是我的 HTML
  • 如何有效地将一个 Pandas Dataframe 的每一列与另一个 Dataframe 的每一列相乘?

    我正在尝试将两个 pandas 数据框相乘 具体来说 我想将每一列与另一个 df 的每一列相乘 数据帧是 one hot 编码的 所以它们看起来像这样 col 1 col 2 col 3 0 1 0 1 0 0 0 0 1 我可以使用 fo
  • 使用 axios 收到 400 错误错误请求

    我正在使用 axios 并收到 400 bad request 错误 我正在使用react redux并尝试向localhost 3000 posts发送post请求 这是我正在使用的代码 import axios from axios i
  • 如何在 Reporting Services 中以 hh:mm:ss 格式显示秒的时间跨度

    在 MS Reporting Services 2008 中 我有一个字段 该字段是以秒的形式存储的持续时间 有没有一种巧妙的方法可以在报告的组部分将其转换为 hh mm ss 格式 如果您只想显示它 请转换文本框值的表达式 Format
  • 如果十进制的范围更短,为什么它比双精度更精确? C#

    Im reading the C in a Nutshell book and it shows this table 我很难理解这张桌子 它说双重需要64 bits的空间 它的范围是10 324 to 10 308 小数取128 bits
  • 服务器和客户端之间的实时视频流 - 使用 Java

    这是我正在进行的项目的一部分 我有两个桌面java应用程序 一个在服务器上运行 有真实IP 另一个是客户端 我只想从连接到服务器应用程序的网络摄像头流式传输实时视频 并在客户端应用程序上播放 我想从多个摄像机进行流媒体播放 我一直在 Xug
  • 从 Selenium webdriver 的当前窗口 GUID 获取窗口句柄 (IntPtr)

    我试图捕获整个浏览器屏幕 例如任何工具栏 面板等 的屏幕截图 而不仅仅是整个页面 所以我得到了以下代码 using FirefoxDriver driver new FirefoxDriver driver Navigate GoToUrl
  • 为什么我不能只更改 Python 中嵌套列表中的单个元素[重复]

    这个问题在这里已经有答案了 我刚刚遇到了一些关于 Python 的非常奇怪的事情 gt gt gt out 0 3 3 gt gt gt out 0 0 0 0 0 0 0 0 0 gt gt gt out 0 1 0 gt gt gt o
  • PHP read_exif_data 和调整方向

    如果方向关闭 我将使用以下代码来旋转上传的 jpeg 图像 我只遇到从 iPhone 和 Android 上传的图像问题 if move uploaded file FILES photo tmp name upload path newf
  • 使用 时限制文件格式?

    我想限制当用户单击 浏览 按钮时可以从本机操作系统文件选择器中选择的文件类型
  • 如何创建 web.config 文件来加载 SoapExtension?

    我需要使用一个SoapExtension子类 我创建的 但似乎这个类只能通过web config文件 我读过这应该可以通过app config文件 但我不知道该怎么做 Problem 我没有web config文件在我的项目中 所以我手动创
  • 按天过滤 pandas 数据框

    我有一个 pandas 数据框 其中包含按分钟排列的外汇数据 长达一年 371635 行 O H L C 0 2017 01 02 02 00 00 1 05155 1 05197 1 05155 1 05190 2017 01 02 02
  • 使用 Google 地方信息 API

    我想开发一个应用程序 在其中我想通过获取用户当前位置来显示用户附近 1公里内 地点的信息 举例来说 我想显示与 Android 设备当前位置相关的 1 公里范围内的餐厅 购物中心 医院的信息 我已经浏览过这个链接 在 Android 中使用
  • 单一维度内不重叠范围的数据结构

    我需要一个可以在单个维度内存储不重叠范围的数据结构 不需要完全覆盖维度的整个范围 一个例子是会议室调度程序 维度是时间 两个时间表不得重叠 会议室并不总是预定的 换句话说 对于给定时间最多可以有一个时间表 一个快速的解决方案是使用一个范围来
  • 在Lua中修改字符串中的字符

    有什么办法可以替换Lua中字符串中第N位的字符 这是我到目前为止所想出的 function replace char pos str r return str sub pos pos 1 r str sub pos 1 str len en