116

特定の文字列で最初に出現するものを置き換えたい。

.NET でこれを実現するにはどうすればよいですか?

4

14 に答える 14

145
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)もありますが、私のメソッドが1つの検索と3つの文字列を実行するフル機能のパーサーを利用しているため、実行時におそらくより高価です連結。

EDIT2:これが一般的なタスクである場合は、メソッドを拡張メソッドにすることをお勧めします。

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

上記の例を使用すると、次のように書くことができます。

str = str.ReplaceFirst("brown", "quick");
于 2008-09-26T18:17:06.503 に答える
68

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"

3 番目のパラメーター (この場合は 1 に設定) は、文字列の先頭から入力文字列で置換する正規表現パターンの出現回数です。

これが静的なRegex.Replaceオーバーロードで実行できることを望んでいましたが、残念ながらそれを達成するには Regex インスタンスが必要なようです。

于 2008-09-28T21:11:49.890 に答える
16
using System.Text.RegularExpressions;

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

Fで最初に検索されInputString、 に置き換えられRます。

于 2010-06-10T07:21:19.370 に答える
16

Regex.Replaceを見てください。

于 2008-09-26T18:13:34.250 に答える
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");
于 2010-11-03T12:00:11.007 に答える
9

C#構文の場合:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
于 2008-09-26T18:20:09.993 に答える
9

これを行う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);    
    } 
}
于 2008-09-26T18:22:19.177 に答える
5

AA文字列の先頭にある場合にのみ置き換える必要があると想定します。

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

AA文字列が で始まるかどうかに関係なく、最初に出現する を置き換える必要がある場合は、Marc のソリューションを使用してください。

于 2010-11-03T12:00:35.303 に答える
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
于 2008-09-26T18:42:35.007 に答える
3

の過負荷の1つは、Regex.Replaceint交換が発生する可能性のある最大回数」になります。明らかに、Regex.Replaceプレーンテキストの置換に使用するのはやり過ぎのように思えるかもしれませんが、それは確かに簡潔です。

string output = (new Regex("AA")).Replace(input, "XQ", 1);
于 2010-11-03T12:12:04.783 に答える
1

この例では、部分文字列を抽象化しています (ただし、処理は遅くなります) が、おそらく RegEx よりもはるかに高速です。

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];
于 2016-05-23T21:52:31.127 に答える
-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
于 2010-11-03T12:04:59.057 に答える