Mam problem polegający na tym, że muszę zamienić ostatnie wystąpienie słowa w ciągu.
Sytuacja: otrzymuję ciąg znaków w tym formacie:
string filePath ="F:/jan11/MFrame/Templates/feb11";
Następnie wymieniam w TnaName
ten sposób:
filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName
To działa, ale mam problem, gdy TnaName
jest taki sam jak mój folder name
. Kiedy tak się dzieje, otrzymuję następujący ciąg:
F:/feb11/MFrame/Templates/feb11
Teraz zastąpił oba wystąpienia TnaName
z feb11
. Czy istnieje sposób, w jaki mogę zamienić tylko ostatnie wystąpienie słowa w moim ciągu?
Uwaga: feb11
to TnaName
, które pochodzi z innego procesu - to nie jest problem.
/
początku?)TnaName
, jest więcej na ścieżce, ale generuję tylko próbkę na pytanie. Dzięki.Odpowiedzi:
Oto funkcja zastępująca ostatnie wystąpienie ciągu
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
to ciąg, na którym chcesz wykonać operację.Find
to ciąg, który chcesz zamienić.Replace
jest ciągiem, którym chcesz go zastąpić.źródło
Place == -1
)public static string ReplaceLastOccurance(this string Source...
i masz sprytną metodę rozszerzenia, której możesz użyć do zastąpienia ostatniego wystąpienia ciągu dla dowolnego ciągu.Użyj,
string.LastIndexOf()
aby znaleźć indeks ostatniego wystąpienia ciągu, a następnie użyj podciągu do wyszukania rozwiązania.źródło
Musisz dokonać wymiany ręcznie:
int i = filePath.LastIndexOf(TnaName); if (i >= 0) filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
źródło
Nie rozumiem, dlaczego nie można użyć Regex:
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); }
Stosowanie:
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
źródło
return Regex.Replace(Regex.Replace(source),pattern, replacement);
,?Możesz użyć
Path
klasy zSystem.IO
namepace:string filePath = "F:/jan11/MFrame/Templates/feb11"; Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));
źródło
Rozwiązanie można wdrożyć jeszcze prościej za pomocą jednej linii:
static string ReplaceLastOccurrence(string str, string toReplace, string replacement) { return Regex.Replace(str, $@"^(.*){toReplace}(.*?)$", $"$1{replacement}$2"); }
Niniejszym wykorzystujemy zachłanność operatora wyrażenia regularnego gwiazdką. Funkcja jest używana w następujący sposób:
var s = "F:/feb11/MFrame/Templates/feb11"; var tnaName = "feb11"; var r = ReplaceLastOccurrence(s,tnaName, string.Empty);
źródło
var lastIndex = filePath.LastIndexOf(TnaName); filePath = filePath.Substring(0, lastIndex);
źródło