Bitte machen Sie klare Beiträge, die die Leute verstehen können. Ich habe dieses auch für dich bearbeitet. Sie sollten zumindest hier eine Sprache angegeben haben.
GEOCHET
Natürlich wird es nie ersetzt ... es ist immer eine neue Zeichenfolge, die die ursprüngliche Zeichenfolge mit ersetztem Text enthält. Dies liegt daran, dass Zeichenfolgen unveränderlich sind.
Pablo Marambio
Ich habe die Methode String.Replace () ausprobiert. aber es ersetzt alle "AA" durch "XQ"
string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
BEARBEITEN : Wie @itsmatt erwähnt , gibt es auch Regex.Replace (String, String, Int32), die das gleiche tun, aber es ist wahrscheinlich teurer zur Laufzeit, da es eine voll funktionsfähige Parser verwendet , wo meine Methode macht eine Entdeckung und drei Zeichenfolge Verkettungen.
EDIT2 : Wenn dies eine häufige Aufgabe ist, möchten Sie die Methode möglicherweise zu einer Erweiterungsmethode machen:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
Mit dem obigen Beispiel ist es jetzt möglich zu schreiben:
Interessanterweise haben Sie Ihre Annahme getestet, dass der Regex-Ansatz zur Laufzeit teurer ist? Wie wäre es mit Geschwindigkeit? Vielleicht ist die Suche mit Regex schneller als mit IndexOf?
Mfloryan
Ich bevorzuge die Antwort von @BilltheLizard mit Remove () und Insert () gegenüber diesem Ansatz mit Substring (). Gibt es eine Grundlage zu sagen, dass einer besser ist als der andere?
JohnC
3
Achtung: Dies funktioniert nicht richtig, wenn Unicode Zeichen oder Ligaturen kombiniert. ReplaceFirst("oef", "œ", "i")Gibt beispielsweise fälschlicherweise "ief" anstelle von "if" zurück. Weitere Informationen finden Sie in dieser Frage .
Michael Liu
2
ReSharper warnt String.IndexOf is culture specific.. Robuster zu aktualisieren int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64
Wie itsmatt sagte, ist Regex.Replace eine gute Wahl, aber um seine Antwort vollständiger zu machen, werde ich sie mit einem Codebeispiel ausfüllen:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
Der dritte Parameter, in diesem Fall auf 1 gesetzt, ist die Anzahl der Vorkommen des Regex-Musters, das Sie ab dem Beginn der Zeichenfolge in der Eingabezeichenfolge ersetzen möchten.
Ich hatte gehofft, dass dies mit einer statischen Regex- Überladung möglich ist, aber leider scheint es, dass Sie eine Regex-Instanz benötigen, um dies zu erreichen.
Vielen Dank! Ich habe dies geändert, um eine "RemoveFirst" -Erweiterungsmethode zu erstellen, die ... das erste Auftreten eines Zeichens aus einer Zeichenfolge entfernt.
pbh101
4
Dies schlägt fehl, wenn oldValue nicht Teil der Zeichenfolge ist.
VVS
8
In der C # -Syntax:
int loc = original.IndexOf(oldValue);if( loc <0){return original;}return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Eine der Überladungen von Regex.Replacedauert ein intfür "Die maximale Häufigkeit, mit der der Austausch erfolgen kann". Natürlich Regex.Replacemag die Verwendung für das Ersetzen von Klartext wie ein Overkill erscheinen, aber es ist sicherlich prägnant:
Antworten:
Beispiel:
BEARBEITEN : Wie @itsmatt erwähnt , gibt es auch Regex.Replace (String, String, Int32), die das gleiche tun, aber es ist wahrscheinlich teurer zur Laufzeit, da es eine voll funktionsfähige Parser verwendet , wo meine Methode macht eine Entdeckung und drei Zeichenfolge Verkettungen.
EDIT2 : Wenn dies eine häufige Aufgabe ist, möchten Sie die Methode möglicherweise zu einer Erweiterungsmethode machen:
Mit dem obigen Beispiel ist es jetzt möglich zu schreiben:
quelle
ReplaceFirst("oef", "œ", "i")
Gibt beispielsweise fälschlicherweise "ief" anstelle von "if" zurück. Weitere Informationen finden Sie in dieser Frage .String.IndexOf is culture specific.
. Robuster zu aktualisierenint pos = text.IndexOf(search, StringComparison.Ordinal);
.Wie itsmatt sagte, ist Regex.Replace eine gute Wahl, aber um seine Antwort vollständiger zu machen, werde ich sie mit einem Codebeispiel ausfüllen:
Der dritte Parameter, in diesem Fall auf 1 gesetzt, ist die Anzahl der Vorkommen des Regex-Musters, das Sie ab dem Beginn der Zeichenfolge in der Eingabezeichenfolge ersetzen möchten.
Ich hatte gehofft, dass dies mit einer statischen Regex- Überladung möglich ist, aber leider scheint es, dass Sie eine Regex-Instanz benötigen, um dies zu erreichen.
quelle
"foo"
, aber Sie wollen einenew Regex(Regex.Escape("foo"))
bildliche"foo"
.Schauen Sie sich Regex.Replace an .
quelle
Unter Berücksichtigung des "nur ersten" vielleicht:
?
Oder allgemeiner:
Dann:
quelle
wird zuerst
F
in findenInputString
und durch ersetzenR
.quelle
result = (New Regex("F")).Replace(InputString, "R", 1)
C # -Erweiterungsmethode, die dies tut:
Genießen
quelle
In der C # -Syntax:
quelle
Und weil es auch VB.NET zu berücksichtigen gibt, möchte ich Folgendes anbieten:
quelle
Angenommen, dies
AA
muss nur ersetzt werden, wenn es sich ganz am Anfang der Zeichenfolge befindet:Wenn Sie das erste Vorkommen von ersetzen müssen
AA
, unabhängig davon , ob die Zeichenfolge damit beginnt oder nicht, wählen Sie die Lösung von Marc.quelle
Eine der Überladungen von
Regex.Replace
dauert einint
für "Die maximale Häufigkeit, mit der der Austausch erfolgen kann". NatürlichRegex.Replace
mag die Verwendung für das Ersetzen von Klartext wie ein Overkill erscheinen, aber es ist sicherlich prägnant:quelle
Für alle, denen ein Verweis nichts ausmacht
Microsoft.VisualBasic
, gibt es dieReplace
Methode :quelle
Dieses Beispiel abstrahiert die Teilzeichenfolgen (ist aber langsamer), aber wahrscheinlich viel schneller als ein RegEx:
quelle
quelle