如何在.NET中replacestring的*第一个实例?

我想replace给定string中的第一个匹配项。

我怎么能在.NET中完成这个?

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 提到 ,也有Regex.Replace(string,string,Int32),可以做同样的,但可能在运行时更昂贵,因为它是利用一个全function的parsing器,我的方法find一个和三个string级联。

编辑2 :如果这是一个常见的任务,你可能想要使该方法的扩展方法:

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

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

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

正如它的表示正则expression式.Replace是一个不错的select,但是为了使他的答案更完整,我将填入一个代码示例:

 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,是从string开始的inputstring中要replace的正则expression式模式的出现次数。

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

看看Regex.Replace 。

考虑到“第一”,也许:

 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"); 
 using System.Text.RegularExpressions; RegEx MyRegEx = new RegEx("F"); string result = MyRegex.Replace(InputString, "R", 1); 

将在InputStringfind第一个F并将其replace为R

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); } } 

请享用

在C#语法中:

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

而且因为也有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 

假设AA只需要在string的起始处被replace:

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

如果您需要更换AA的第一个匹配项,那么string是否以它开头,请使用Marc的解决scheme。

Regex.Replace的重载之一是“可以发生replace的最大次数”。 显然,使用Regex.Replace进行纯文本replace可能看起来像是矫枉过正,但它确实简洁:

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

Regex.Replace ,特别是RegEx.Replace(string,string,int),可能是你正在寻找的东西。 那或String.IndexOf这将给你的索引,然后你可以剪切和重新生成你想要的新文本的string。

展示后者的一个例子(首先由@David Humpohl展示 ):

 string str = "Hello WorldWorld"; str = ReplaceFirst(str, "World", "StackOverflow "); ... string ReplaceFirst(string text, string search, string replace) { int pos = text.IndexOf(search); if (pos >= 0) { return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); } return text; } 

对于任何不介意引用Microsoft.VisualBasic ,都有Replace方法 :

 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]; 
 string abc = "AAAAX1"; if(abc.IndexOf("AA") == 0) { abc.Remove(0, 2); abc = "XQ" + abc; }