ChatGPT解决这个技术问题 Extra ChatGPT

如何替换 .NET 中字符串的*第一个实例*?

我想替换给定字符串中的第一次出现。

如何在 .NET 中完成此任务?

请写清楚人们可以理解的帖子。我也为你编辑了这个。您至少应该在此处指定一种语言。
当然,它永远不会被替换......它始终是一个新字符串,其中包含带有替换文本的原始字符串。这是因为字符串是不可变的。
我尝试了`String.Replace()` 方法。但它用“XQ”替换了所有的“AA”
这个问题 - stackoverflow.com/questions/141045/… - 揭示了你需要做什么
注意:与另一个使用“AA”=>“XQ”作为查找/替换示例的类似问题合并。

C
Community
string ReplaceFirst(string text, string search, string replace)
{
  int pos = text.IndexOf(search);
  if (pos < 0)
  {
    return text;
  }
  return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}

例子:

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

编辑:作为@itsmatt mentioned,还有 Regex.Replace(String, String, Int32),它可以做同样的事情,但在运行时可能更昂贵,因为它使用了一个全功能的解析器我的方法做了一个查找和三个字符串连接。

EDIT2:如果这是一项常见任务,您可能希望将该方法设为扩展方法:

public static class StringExtension
{
  public static string ReplaceFirst(this string text, string search, string replace)
  {
     // ...same as above...
  }
}

使用上面的示例,现在可以编写:

str = str.ReplaceFirst("brown", "quick");

注意:这不适用于 Unicode 组合字符或连字。例如,ReplaceFirst("oef", "œ", "i") 错误地返回“ief”而不是“if”。有关详细信息,请参阅 this question
W
Wes Haggard

正如 itsmatt 所说,Regex.Replace 是一个不错的选择,但是为了使他的答案更完整,我将用代码示例填充它:

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

第三个参数,在这种情况下设置为 1,是要在输入字符串中从字符串开头替换的正则表达式模式的出现次数。

我希望这可以通过静态 Regex.Replace 重载来完成,但不幸的是,您似乎需要一个 Regex 实例来完成它。


这适用于文字 "foo",但您需要一个 new Regex(Regex.Escape("foo")) 来表示比喻 "foo"
i
itsmatt

看看Regex.Replace


具体来说,Regex.Replace Method (String, String, Int32) 可以解决问题并且非常简洁。
A
Alan Moore
using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

将在 InputString 中找到第一个 F 并将其替换为 R


我通过 result = (New Regex("F")).Replace(InputString, "R", 1) 将其简化为单行
最佳答案在这里(与 cjbarth 一起)
语法可能不是 RegEx 而是 Regex,具体取决于版本。
M
Marc Gravell

考虑到“唯一”,也许:

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

?

或更一般地说:

public static string ReplaceFirstInstance(this string source,
    string find, string replace)
{
    int index = source.IndexOf(find);
    return index < 0 ? source : source.Substring(0, index) + replace +
         source.Substring(index + find.Length);
}

然后:

string output = input.ReplaceFirstInstance("AA", "XQ");

B
Bill the Lizard

在 C# 语法中:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);

K
Kech101

将执行此操作的 C# 扩展方法:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

谢谢!我对此进行了修改以制作一个“RemoveFirst”扩展方法,该方法......从字符串中删除第一次出现的字符。
如果 oldValue 不是字符串的一部分,这将失败。
O
Oded

假设 AA 仅在它位于字符串的开头时才需要替换:

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

如果您需要替换第一次出现的 AA,无论字符串是否以它开头,请使用 Marc 的解决方案。


A
Anthony Potts

而且因为还需要考虑 VB.NET,所以我想提供:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function

A
AakashM

Regex.Replace 的重载之一采用 int 表示“可以发生替换的最大次数”。显然,使用 Regex.Replace 进行纯文本替换可能看起来有点矫枉过正,但它确实很简洁:

string output = (new Regex("AA")).Replace(input, "XQ", 1);

S
Slai

对于不介意引用 Microsoft.VisualBasic 的任何人,可以使用 Replace Method

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"

佚名

此示例抽象出子字符串(但速度较慢),但可能比 RegEx 快得多:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];

B
Brad Patton

更新了利用 Span 的扩展方法,以最大限度地减少新字符串的创建

    public static string ReplaceFirstOccurrence(this string source, string search, string replace) {
        int index = source.IndexOf(search);
        if (index < 0) return source;
        var sourceSpan = source.AsSpan();
        return string.Concat(sourceSpan.Slice(0, index), replace, sourceSpan.Slice(index + search.Length));
    }

M
Matěj Štágl

使用范围和 C# 10,我们可以做到:

public static string ReplaceFirst(this string text, string search, string replace)
{
    int pos = text.IndexOf(search, StringComparison.Ordinal);
    return pos < 0 ? text : string.Concat(text[..pos], replace, text.AsSpan(pos + search.Length));
}

佚名
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }