如何仅对字符串的一小部分执行字符串替换?

2023-12-13

我想要一种有效的方法,可以起到这样的作用

编辑:抱歉,我没有输入我之前尝试过的内容。我现在更新了这个例子。

// Method signature, Only replaces first instance or how many are specified in max
public int MyReplace(ref string source,string org, string replace, int start, int max)
{
     int ret = 0;
     int len = replace.Length;
     int olen = org.Length;
     for(int i = 0; i < max; i++)
     {
          // Find the next instance of the search string
          int x = source.IndexOf(org, ret + olen);
          if(x > ret)
             ret = x;
          else
             break;

         // Insert the replacement
         source = source.Insert(x, replace);
         // And remove the original
         source = source.Remove(x + len, olen); // removes original string
     }
     return ret;
}

string source = "The cat can fly but only if he is the cat in the hat";
int i = MyReplace(ref source,"cat", "giraffe", 8, 1); 

// Results in the string "The cat can fly but only if he is the giraffe in the hat"
// i contains the index of the first letter of "giraffe" in the new string

我问的唯一原因是因为我想象我的实现会因 1,000 次替换而变得缓慢。


怎么样:

public static int MyReplace(ref string source,
    string org, string replace, int start, int max)
{
    if (start < 0) throw new System.ArgumentOutOfRangeException("start");
    if (max <= 0) return 0;
    start = source.IndexOf(org, start);
    if (start < 0) return 0;
    StringBuilder sb = new StringBuilder(source, 0, start, source.Length);
    int found = 0;
    while (max-- > 0) {
        int index = source.IndexOf(org, start);
        if (index < 0) break;
        sb.Append(source, start, index - start).Append(replace);
        start = index + org.Length;
        found++;
    }
    sb.Append(source, start, source.Length - start);
    source = sb.ToString();
    return found;
}

it uses StringBuilder以避免大量中间strings;我没有经过严格测试,但它似乎有效。它还试图避免额外的string当没有匹配项时。

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

如何仅对字符串的一小部分执行字符串替换? 的相关文章

随机推荐

  • 当 Pageant 完成加载 SSH 密钥时运行批处理文件

    我编写了两个批处理文件 一个用于启动 Pageant 并加载我的密钥 另一个用于将一些文件 ssh 到远程服务器上 单独来看 这些脚本运行得非常完美 我试图将它们组合成一个批处理文件 但我无法让它工作 这是脚本 实际上每个脚本只有一行 要启
  • iOS 应用 Display Recorder 如何在不使用私有 API 的情况下录制屏幕?

    iOS 应用程序显示记录仪声称能够录制 iOS 设备的屏幕 即使它在后台 鉴于UIGetScreenImage 是私有 API 当 Apple 运行的静态分析检测到时 将导致应用程序提交被拒绝 他们是如何在已批准的应用程序中进行此记录的 此
  • 错误:“x”未定义

    我在运行 Octave 函数 ODE 时遇到问题 我已经尝试过针对此问题的现有解决方案 但没有任何效果 我也尝试过将文件名另存为egzamin m但它也不起作用 来自八度的代码 function dx egzamin x t dx zero
  • 我可以合法地将成员函数指针转换为函数指针吗?

    我继承了一些 C 代码 并且负责消除警告 这里我们有一个成员函数指针被转换为函数指针 我知道成员函数指针与函数指针 不同 因为在幕后有一个隐式的 this 参数 然而 我的前任似乎已经明确地利用了这一事实 通过从成员函数指针转换为插入了附加
  • 如何更快地从 Selenium WebElement 获取值?

    这是我从 Selenium WebElement 获取值的测试代码 import java util List import org apache commons lang3 ObjectUtils Null import org open
  • java中从mysql存储过程中获取参数

    我在从 java 中的 mysql 存储过程检索 OUT 参数时遇到问题 CALL proc after topic add newtest result SELECT result 这个查询给了我想要的输出参数 但我如何在java中检索它
  • ASIHTTPRequest,请求完成时 EXC_BAD_ACCESS

    我正在尝试使用 ASIHTTPRequest 执行异步请求 但在请求完成时收到通知时遇到一些问题 void doDownload NSURL url NSURL URLWithString http www someurl com ASIF
  • 模板中的变量包含模板

    我试图将值放入 标题 模板中 例如标题和导航链接 但无法访问我从包含的模板发送到主模板的变量 渲染模板 templateName index args map string string Title Main Page Body This
  • 如何为 PHP 文件启用 mod_deflate?

    我有一个 Liquid Web VPS 帐户 我已确保 mod deflate 已安装并正在运行 活动 我曾经通过 PHP 来 gzip 我的 css 和 js 文件 以及我的 PHP 文件本身 但是 我现在尝试通过 mod deflate
  • 更改数字精度

    例如 您将如何更改数字的精度 float n 1 2345并将其存储回变量 n 并将其更改为1 23 float n 1 2345 int scaled n 100 n static cast
  • 修复 go 使用的工具版本

    我希望用 go 创建可重复的构建 对于个别项目 我们使用 glide 例如我使用 glide get github com stretchr testify 修复 testify 包的版本 然而 这不适用于工具 例如 glide insta
  • 使用 Application.FileDialog 选择文件夹

    我使用 Application FileDialog 让用户选择一个文件夹 如下所示 Dim F As FileDialog Set F Application FileDialog msoFileDialogFolderPicker 在这
  • 将 PostCSS 更新到 React 版本 8 后应用程序无法运行

    当我在我的应用程序中工作时 我注意到我有 80 个漏洞 主要是因为同行版本 比如一个要求 React 16 8 0 而我有 17 0 1 之类的东西 但另一个说 Moderate Regular Expression Denial of S
  • 在 FireFox/Greasemonkey 中使用 JavaScript 发送全局击键

    我目前有一个 GM 脚本 可以捕获击键并以编程方式单击网页上的元素 但是 这仅在页面 选项卡具有焦点时才有效 有什么方法可以捕获第二个页面 选项卡中的击键并将单击应用于第一个页面 选项卡上的元素吗 我知道我可以通过在 JavaScript
  • xampp 1.7.4 + winxp + eclipse

    我下载了最新的 Xampp 版本 1 7 4 在 Windows XP 下安装它 禁用防火墙并根据 eclipse 安装说明配置 php ini 和 eclipse 当在 eclipse 内部和外部运行 phpinfo 函数时 我看到 Xd
  • 如何将新项目推送到对象内部的数组

    我的 JSON 目前看起来像这样 id 393 item 34 comments name kevin messages item item name ryan messages item item
  • E:无法找到包 heroku-toolbelt

    我正在尝试安装Heroku Toolbelt在 Linux Mint 15 Olivia x86 64 上 当我尝试运行在 Debian 机器上安装的标准命令时 wget qO https toolbelt heroku com insta
  • Ionic PouchDb Sqlite 插件问题

    我们正在认真探索 Ionic PouchDb 和 CouchDb 作为满足我们需求之一的解决方案 我们需要构建一个可以提供离线同步功能并且与平台无关的移动应用程序 我们的另一个主要要求之一是 离线模式下的数据本质上是持久性的 并且可以增长超
  • 为什么我们需要在 CUDA 内核中跨步?

    我想知道 为什么需要使用网格跨度跨步执行以下循环 for int i index i lt ITERATIONS i stride C i A i B i 我们将步幅和索引设置为 index blockIdx x blockDim x th
  • 如何仅对字符串的一小部分执行字符串替换?

    我想要一种有效的方法 可以起到这样的作用 编辑 抱歉 我没有输入我之前尝试过的内容 我现在更新了这个例子 Method signature Only replaces first instance or how many are speci