与えられた文字列の最初の出現を置き換えたい。
.NETでこれを実現するにはどうすればよいですか?
与えられた文字列の最初の出現を置き換えたい。
.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)もあります。これは同じことを実行できますが、私のメソッドが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");
ReplaceFirst("oef", "œ", "i")
「if」ではなく「ief」を誤って返します。詳細については、この質問を参照してください。
String.IndexOf is culture specific.
ます。に更新する方が堅牢int pos = text.IndexOf(search, StringComparison.Ordinal);
です。
以下のよう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インスタンスが必要であるようです。
"foo"
に機能しますがnew Regex(Regex.Escape("foo"))
、比喩的なものを必要とするでしょう"foo"
。
「最初のみ」を考慮に入れて、おそらく:
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);
が最初F
に見つかり、InputString
で置き換えR
ます。
result = (New Regex("F")).Replace(InputString, "R", 1)
これを行う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);
}
}
楽しい
考慮すべき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
への参照を気にしない人のために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;
}