У меня проблема, когда мне нужно заменить последнее вхождение слова в строке.
Ситуация: мне дана строка в следующем формате:
string filePath ="F:/jan11/MFrame/Templates/feb11";
Затем я заменяю TnaName
вот так:
filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName
Это работает, но у меня проблема, когда TnaName
он такой же, как мой folder name
. Когда это происходит, я получаю такую строку:
F:/feb11/MFrame/Templates/feb11
Теперь он заменил оба вхождения TnaName
с feb11
. Есть ли способ заменить только последнее вхождение слова в строке?
Примечание: feb11
это TnaName
результат другого процесса - это не проблема.
/
момента?)TnaName
в пути больше, но я генерирую только образец для вопроса. Спасибо .Ответы:
Вот функция для замены последнего вхождения строки
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
- строка, над которой вы хотите выполнить операцию.Find
это строка, которую вы хотите заменить.Replace
- это строка, которой вы хотите ее заменить.источник
Place == -1
)public static string ReplaceLastOccurance(this string Source...
и у вас есть отличный метод расширения, который вы можете использовать для замены последнего вхождения строки для любой строки.Используйте
string.LastIndexOf()
для поиска индекса последнего вхождения строки, а затем используйте подстроку для поиска решения.источник
Вам необходимо произвести замену вручную:
int i = filePath.LastIndexOf(TnaName); if (i >= 0) filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
источник
Я не понимаю, почему нельзя использовать 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); }
Применение:
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
источник
return Regex.Replace(Regex.Replace(source),pattern, replacement);
?Вы можете использовать
Path
класс изSystem.IO
пространства имен:string filePath = "F:/jan11/MFrame/Templates/feb11"; Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));
источник
Решение можно реализовать еще проще с помощью одной строчки:
static string ReplaceLastOccurrence(string str, string toReplace, string replacement) { return Regex.Replace(str, $@"^(.*){toReplace}(.*?)$", $"$1{replacement}$2"); }
Таким образом, мы воспользовались жадностью оператора звездочки регулярного выражения. Функция используется так:
var s = "F:/feb11/MFrame/Templates/feb11"; var tnaName = "feb11"; var r = ReplaceLastOccurrence(s,tnaName, string.Empty);
источник
var lastIndex = filePath.LastIndexOf(TnaName); filePath = filePath.Substring(0, lastIndex);
источник