.net - parte - vb net sostituire caratteri in una stringa




Come sostituire la*prima istanza*di una stringa in.NET? (10)

Voglio sostituire la prima occorrenza in una determinata stringa.

Come posso realizzare questo in .NET?


Come ha detto il suo Regex.Replace è una buona scelta per questo, tuttavia, per rendere la sua risposta più completa, la compilerò con un esempio di codice:

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

Il terzo parametro, impostato su 1 in questo caso, è il numero di occorrenze del modello regex che si desidera sostituire nella stringa di input dall'inizio della stringa.

Speravo che questo potesse essere fatto con un sovraccarico di Regex.Replace statico, ma sfortunatamente sembra che tu abbia bisogno di un'istanza Regex per realizzarlo.



In sintassi C #:

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

Metodo di estensione C # che farà questo:

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

Godere


Prendendo in considerazione il "primo solo", forse:

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

?

O più in generale:

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

Poi:

string output = input.ReplaceFirstInstance("AA", "XQ");

Questo esempio astrae le sottostringhe (ma è più lento), ma è probabilmente molto più veloce di una RegEx:

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

Uno degli overload di Regex.Replace richiede un int per "Il numero massimo di volte che la sostituzione può verificarsi". Ovviamente, l'utilizzo di Regex.Replace per la sostituzione del testo normale può sembrare eccessivo, ma è certamente conciso:

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

Regex.Replace , in particolare RegEx.Replace (string, string, int), è probabilmente quello che stai cercando. Quello o String.IndexOf che ti darà l'indice e quindi puoi tagliare e ricostruire la stringa con il nuovo testo che vuoi.

Un esempio che dimostra il secondo (come dimostrato da @David Humpohl ):

string str = "Hello WorldWorld";

str = ReplaceFirst(str, "World", " ");

...

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

string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }

using System.Text.RegularExpressions;

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

troverà il primo F in InputString e lo sostituirà con R





replace