Ich habe ein Problem, bei dem ich das letzte Vorkommen eines Wortes in einer Zeichenfolge ersetzen muss.
Situation: Ich erhalte eine Zeichenfolge in diesem Format:
string filePath ="F:/jan11/MFrame/Templates/feb11";
Ich ersetze dann TnaName
so:
filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName
Das funktioniert, aber ich habe ein Problem, wenn TnaName
es dasselbe ist wie meins folder name
. Wenn dies passiert, bekomme ich eine Zeichenfolge wie die folgende:
F:/feb11/MFrame/Templates/feb11
Jetzt hat es beide Vorkommen von TnaName
durch ersetzt feb11
. Gibt es eine Möglichkeit, nur das letzte Vorkommen des Wortes in meiner Zeichenfolge zu ersetzen?
Hinweis: feb11
ist TnaName
die von einem anderen Prozess kommt - das ist kein Problem.
/
an?)TnaName
gibt es mehr im Pfad, aber ich generiere nur Probe für Frage. Danke .Antworten:
Hier ist die Funktion zum Ersetzen des letzten Auftretens einer Zeichenfolge
public static string ReplaceLastOccurrence(string Source, string Find, string Replace) { int place = Source.LastIndexOf(Find); if(place == -1) return Source; string result = Source.Remove(place, Find.Length).Insert(place, Replace); return result; }
Source
ist die Zeichenfolge, für die Sie die Operation ausführen möchten.Find
ist die Zeichenfolge, die Sie ersetzen möchten.Replace
ist die Zeichenfolge, durch die Sie sie ersetzen möchten.quelle
Place == -1
)public static string ReplaceLastOccurance(this string Source...
und Sie haben eine raffinierte Erweiterungsmethode, mit der Sie das letzte Vorkommen einer Zeichenfolge für eine beliebige Zeichenfolge ersetzen können.Verwenden Sie
string.LastIndexOf()
diese Option , um den Index des letzten Vorkommens der Zeichenfolge zu ermitteln, und verwenden Sie dann die Teilzeichenfolge, um nach Ihrer Lösung zu suchen.quelle
Sie müssen das Ersetzen manuell durchführen:
int i = filePath.LastIndexOf(TnaName); if (i >= 0) filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
quelle
Ich verstehe nicht, warum Regex nicht verwendet werden kann:
public static string RegexReplace(this string source, string pattern, string replacement) { return Regex.Replace(source,pattern, replacement); } public static string ReplaceEnd(this string source, string value, string replacement) { return RegexReplace(source, $"{value}$", replacement); } public static string RemoveEnd(this string source, string value) { return ReplaceEnd(source, value, string.Empty); }
Verwendung:
string filePath ="F:/feb11/MFrame/Templates/feb11"; filePath = filePath.RemoveEnd("feb11"); // F:/feb11/MFrame/Templates/ filePath = filePath.ReplaceEnd("feb11","jan11"); // F:/feb11/MFrame/Templates/jan11
quelle
return Regex.Replace(Regex.Replace(source),pattern, replacement);
?Sie können eine
Path
Klasse aus demSystem.IO
Namespace verwenden:string filePath = "F:/jan11/MFrame/Templates/feb11"; Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));
quelle
Die Lösung kann mit einer einzigen Zeile noch einfacher implementiert werden:
static string ReplaceLastOccurrence(string str, string toReplace, string replacement) { return Regex.Replace(str, $@"^(.*){toReplace}(.*?)$", $"$1{replacement}$2"); }
Hierbei nutzen wir die Gier des Regex-Sternchen-Operators. Die Funktion wird folgendermaßen verwendet:
var s = "F:/feb11/MFrame/Templates/feb11"; var tnaName = "feb11"; var r = ReplaceLastOccurrence(s,tnaName, string.Empty);
quelle
var lastIndex = filePath.LastIndexOf(TnaName); filePath = filePath.Substring(0, lastIndex);
quelle