99

我有一个问题,我需要替换字符串中最后一次出现的单词。

情况:我得到一个格式如下的字符串:

string filePath ="F:/jan11/MFrame/Templates/feb11";

然后我像这样替换TnaName

filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName

这行得通,但是当TnaName与我的folder name. 当发生这种情况时,我最终会得到一个这样的字符串:

F:/feb11/MFrame/Templates/feb11

现在它已经替换了两个出现的TnaNamewith feb11。有没有办法可以只替换字符串中最后一次出现的单词?

注意:feb11TnaName来自另一个进程 - 这不是问题。

4

8 回答 8

205

这是替换最后一次出现的字符串的函数

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是您要替换它的字符串。
于 2013-02-12T05:33:17.057 回答
12

用于string.LastIndexOf()查找字符串最后一次出现的索引,然后使用 substring 查找您的解决方案。

于 2013-02-12T05:28:57.530 回答
8

您必须手动进行替换:

int i = filePath.LastIndexOf(TnaName);
if (i >= 0)
    filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
于 2013-02-12T05:33:59.037 回答
4

我不明白为什么不能使用 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
于 2016-08-25T21:28:22.133 回答
1

使用一行代码可以更简单地实现该解决方案:

 static string ReplaceLastOccurrence(string str, string toReplace, string replacement)
    {
        return Regex.Replace(str, $@"^(.*){Regex.Escape(toReplace)}(.*?)$", $"$1{Regex.Escape(replacement)}$2");
    }

因此,我们利用了正则表达式星号运算符的贪婪性。该函数的使用如下:

var s = "F:/feb11/MFrame/Templates/feb11";
var tnaName = "feb11";
var r = ReplaceLastOccurrence(s,tnaName, string.Empty);
于 2019-11-12T15:09:02.610 回答
0

您可以使用命名空间中的PathSystem.IO

string filePath = "F:/jan11/MFrame/Templates/feb11";

Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));
于 2013-02-12T05:37:42.517 回答
0

以下内容不会TnaName在路径/字符串中替换,而是在不TnaName包含的情况下返回它:

var lastIndex = filePath.LastIndexOf(TnaName); // get position of TnaName

filePath = filePath.Substring(0, lastIndex); // get path till position of TnaName
于 2020-09-16T12:32:00.877 回答
0

以下函数在模式(要替换的单词)最后出现的位置拆分字符串。
然后它使用替换字符串(在字符串的后半部分)更改模式。
最后,它再次将两个半字符串连接起来。

using System.Text.RegularExpressions;

public string ReplaceLastOccurance(string source, string pattern, string replacement)
{
   int splitStartIndex = source.LastIndexOf(pattern, StringComparison.OrdinalIgnoreCase);
   string firstHalf = source.Substring(0, splitStartIndex);
   string secondHalf = source.Substring(splitStartIndex, source.Length - splitStartIndex);
   secondHalf = Regex.Replace(secondHalf, pattern, replacement, RegexOptions.IgnoreCase);

   return firstHalf + secondHalf;
}
于 2021-06-01T16:15:35.277 回答