web-dev-qa-db-ja.com

.NETの文字列の*最初のインスタンス*を置き換えるにはどうすればよいですか?

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

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

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

[〜#〜] edit [〜#〜]:@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");
125
VVS

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に設定されている3番目のパラメーターは、入力文字列で文字列の先頭から置換する正規表現パターンの出現回数です。

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

60
Wes Haggard

Regex.Replace を見てください。

16
itsmatt

「最初のみ」を考慮して、おそらく:

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");
15
Marc Gravell
using System.Text.RegularExpressions;

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

Fで最初のInputStringを見つけ、それをRに置き換えます。

10
Deenesh

C#構文の場合:

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

これを行う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);    
    } 
}

楽しい

8
mortenbpost

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

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

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

4
Oded

また、考慮すべき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
Anthony Potts

Regex.Replaceのオーバーロードの1つは、「置換が発生できる最大回数」のintを受け取ります。明らかに、プレーンテキストの置換にRegex.Replaceを使用するのはやり過ぎのように思えるかもしれませんが、確かに簡潔です。

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

Microsoft.VisualBasicへの参照を気にしない人には、 Replace Method があります。

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

Regex.Replace 、特にRegEx.Replace(string、string、int)は、おそらく探しているものです。それまたはString.IndexOfはあなたにインデックスを与えます。そして、あなたはあなたが望む新しいテキストで文字列をカットして再構築することができます。

後者を示す例(最初に @ 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;
}
1
Orion Adrian

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

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