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


108

我想替换给定字符串中的第一个匹配项。

如何在.NET中完成此操作?


请发表清楚的帖子,使人们可以理解。我也为你编辑了这个。您至少应该在这里指定一种语言。
GEOCHET

当然,它永远不会被替换 ……它始终是一个新字符串,其中包含带有替换文本的原始字符串。这是因为字符串是不可变的。
Pablo Marambio 2010年

我尝试了String.Replace()方法。但是它将所有的“ AA”替换为“ XQ”
Thorin Oakenshield

2
这个问题- stackoverflow.com/questions/141045/... -显示你需要做的一切
stack72

1
注意:与另一个类似的问题合并,该问题使用“ AA” =>“ XQ”作为查找/替换的示例。
马克·格雷夫

Answers:


134
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),它可以执行相同的操作,但是在运行时可能会更昂贵,因为它利用的是功能齐全的解析器,其中我的方法执行一个查找和三个字符串级联。

EDIT2:如果这是一项常见任务,则可能需要将该方法作为扩展方法:

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

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

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

2
有趣的是,您是否测试了有关正则表达式方法在运行时更昂贵的假设?速度如何?也许使用Regex进行搜索比使用IndexOf进行搜索更快?
mfloryan 2011年

我有点喜欢@BilltheLizard的涉及Remove()和Insert()的答案,而不是这种涉及Substring()的方法。有没有理由说一个比另一个更好?
JohnC

3
当心:这不适用于Unicode组合字符或连字的情况。例如,ReplaceFirst("oef", "œ", "i")错误地返回“ ief”而不是“ if”。有关更多信息,请参见此问题
Michael Liu

2
ReSharper警告String.IndexOf is culture specific.。更新到的功能更强大int pos = text.IndexOf(search, StringComparison.Ordinal);
康坦戈2015年

64

正如其mattatRegex.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实例才能完成此操作。


1
这对于文字是有效的"foo",但是您将需要一个new Regex(Regex.Escape("foo"))具有比喻性的符号"foo"
鲁芬


15

考虑到“仅第一”,也许:

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

11
using System.Text.RegularExpressions;

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

首先发现FInputString,并取代它R


2
我通过result = (New Regex("F")).Replace(InputString, "R", 1)
cjbarth

最佳答案(与cjbarth结合使用)
Todd Vance

8

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”扩展方法,该方法...从字符串中删除字符的首次出现。
pbh101

4
如果oldValue不是字符串的一部分,这将失败。
VVS 2010年

8

在C#语法中:

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

4

并且由于还考虑了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

4

假设AA仅在字符串的开始处才需要替换它:

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

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


3

一项所述的过载的Regex.Replace需要一个int用于“的时间可以发生置换的最大数量”。显然,Regex.Replace用于纯文本替换似乎有点过分,但是肯定很简洁:

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

2

对于任何不介意引用的人Microsoft.VisualBasic,都有ReplaceMethod方法

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

1

这个例子抽象了子字符串(但速度较慢),但可能比RegEx快得多:

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

-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.