如何替换字符串中的字符串,除了第一次出现

本文关键字:字符串 第一次 何替换 替换 | 更新日期: 2023-09-27 18:09:15

如何替换字符串中的字符串,除了第一次出现?

C:''Test-Processed'1-Processed'2-Processed应该输出

C:''Test-Processed'1'2

如何替换字符串中的字符串,除了第一次出现

类似如下:

string originalStr = "C:''Test-Processed''1-Processed''2-Processed";
string temp = "-Processed";
string str = originalStr.Substring(0, originalStr.IndexOf(temp) + temp.Length);
originalStr = str + originalStr.Substring(str.Length).Replace(temp, "");

originalStr将是:

originalStr = "C:''Test-Processed''1''2"

这里的关键是存在一个indexOf,它从字符串的某一点开始搜索字符串,而不是从字符串的开始搜索。这里:http://msdn.microsoft.com/en-us/library/7cct0x33.aspx

首先,您想使用.indexOf("-Processed")来查找字符串中-Processed的第一个索引。记住这个索引

现在,使用.indexOf("-Processed", index+1)查找-Processed的下一个不是第一个的索引。

重复该操作和Substring(nextindex, "-Processed".Length),以删除这些额外的实例,直到您发现没有更多。

像这样:

String str = @"C:''Test-Processed'1-Processed'2-Processed";
System.Console.WriteLine(new Regex("(''d+)-Processed").Replace(str, "$1"));

将生成C:''Test-Processed'1'2。正则表达式假定要删除的元素前面总是有一个或多个数字。它将把这些数字放在一个捕获组中,并用数字(1)替换子字符串(示例1- processed)。

编辑:如果假设失败,您可能需要采取@Patashu建议的方法。

string ReplaceExceptFirst(string text, string search, string replace)
{
    int pos = text.IndexOf(search);
    if (pos < 0)
    {
        return text;
    }
    int strlen = pos + search.Length;
    return text.Substring(0, strlen) +  (text.Substring(strlen)).Replace(search,replace);
}

这是上面给出的解决方案之一。(解由Habib和参数命名由Pintu Paul)。我使用它,但随后将函数定义为字符串扩展。


public static class StringExtensions
{
    public static string ReplaceAllButFirst(this string originalStr, string search, string replace)
    {
        string str = originalStr.Substring(0, originalStr.IndexOf(search, System.StringComparison.InvariantCultureIgnoreCase) + search.Length);
        return str + originalStr.Substring(str.Length).Replace(search, replace);  
    }
}