Jak mogę wymienić * * pierwsze wystąpienie z ciąg w .NET?

głosy
94

Chcę, aby zastąpić pierwsze wystąpienie w danym ciągu znaków.

W jaki sposób można tego dokonać w .NET?

Utwórz 26/09/2008 o 19:10
źródło użytkownik
W innych językach...                            


14 odpowiedzi

głosy
117
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);
}

Przykład:

string str = "The brown brown fox jumps over the lazy dog";

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

EDIT : Jak @itsmatt wspomniano , istnieje również Regex.Replace (String, String, Int32), co może zrobić to samo, ale to prawdopodobnie droższe w czasie wykonywania, ponieważ jest wykorzystanie w pełni funkcjonalny parser gdzie moja metoda ma znaleźć i trzy ciąg powiązań,.

EDIT2 : Jeśli jest to wspólne zadanie, może chcesz uczynić metoda metodę rozszerzenia:

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

W powyższym przykładzie jest to teraz możliwe, aby napisać:

str = str.ReplaceFirst("brown", "quick");
Odpowiedział 26/09/2008 o 19:17
źródło użytkownik

głosy
56

Jak itsmatt powiedział Regex.Replace jest dobrym wyborem do tego jednak, aby jego odpowiedź pełniejsze będę wypełnić go z próbki kodu:

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

Trzeci parametr, wartość 1 w tym przypadku, to liczba wystąpień wzorca regex, który chcesz zastąpić w ciągu wejściowego od początku łańcucha.

Miałem nadzieję, że może to być zrobione ze statycznym Regex.Replace przeciążenia ale niestety wydaje się, trzeba regex wystąpienie tego dokonać.

Odpowiedział 28/09/2008 o 22:11
źródło użytkownik

głosy
16

Spójrz na Regex.Replace .

Odpowiedział 26/09/2008 o 19:13
źródło użytkownik

głosy
13

Biorąc „pierwszy tylko” pod uwagę, może:

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

?

Lub bardziej ogólnie:

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

Następnie:

string output = input.ReplaceFirstInstance("AA", "XQ");
Odpowiedział 03/11/2010 o 13:00
źródło użytkownik

głosy
9
using System.Text.RegularExpressions;

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

znajdzie pierwszy Fw InputStringi zastąpić ją R.

Odpowiedział 10/06/2010 o 08:21
źródło użytkownik

głosy
6

C # metoda rozszerzenie, że będzie to zrobić:

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

Cieszyć się

Odpowiedział 26/09/2008 o 19:22
źródło użytkownik

głosy
6

W składni C #:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Odpowiedział 26/09/2008 o 19:20
źródło użytkownik

głosy
4

Zakłada, że AAtylko trzeba go wymienić, jeśli jest na samym początku łańcucha:

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

Jeśli trzeba wymienić pierwsze wystąpienie AA, czy ciąg rozpoczyna się z nim lub nie, iść z roztworu z Markiem.

Odpowiedział 03/11/2010 o 13:00
źródło użytkownik

głosy
4

A ponieważ istnieje również VB.NET do rozważenia, chciałbym oferują:

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
Odpowiedział 26/09/2008 o 19:42
źródło użytkownik

głosy
3

Jednym z przeciążeniami od Regex.Replaceprzyjmuje postać w int„The maksymalną liczbę razy może nastąpić wymiana”. Oczywiście, używając Regex.Replacedo zastąpienia zwykłego tekstu może wydawać się przesadą, ale to na pewno zwięzły:

string output = (new Regex("AA")).Replace(input, "XQ", 1);
Odpowiedział 03/11/2010 o 13:12
źródło użytkownik

głosy
2

Dla każdego, kto nie ma nic odniesienie do Microsoft.VisualBasic, istnieje Replacemetoda :

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
Odpowiedział 01/03/2017 o 13:36
źródło użytkownik

głosy
1

Regex.Replace , zwłaszcza Regex.Replace (string, string, int), jest prawdopodobnie to, czego szukasz. Że albo String.indexOf który daje indeks, a następnie można wyciąć i odbudować łańcuch z nowym tekstem, który chcesz.

Przykład wykazanie drugi (jak pierwszy wykazano @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;
}
Odpowiedział 26/09/2008 o 19:14
źródło użytkownik

głosy
0

Ten przykład abstracts precz podciągi (ale wolniej), ale to chyba dużo szybko niż regex:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];
Odpowiedział 23/05/2016 o 21:52
źródło użytkownik

głosy
-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
Odpowiedział 03/11/2010 o 13:04
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more