替换字符串中最后一个出现的单词—C#

本文关键字:单词 字符串 最后一个 替换 | 更新日期: 2023-09-27 17:58:41

我遇到了一个问题,需要替换字符串中最后一个单词。

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

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

然后我这样替换TnaName

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

这是有效的,但当TnaName和我的folder name相同时,我有一个问题。当这种情况发生时,我会得到这样的字符串:

F:/feb11/MFrame/Templates/feb11

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

注意:feb11是来自另一个进程的TnaName,这不是问题

替换字符串中最后一个出现的单词—C#

以下是替换string 最后一次出现的函数

public static string ReplaceLastOccurrence(string source, string find, string replace)
{
    int place = source.LastIndexOf(find);
    
    if (place == -1)
       return source;
    
    return source.Remove(place, find.Length).Insert(place, replace);
}
  • source是要对其执行操作的字符串
  • find是要替换的字符串
  • replace是要替换它的字符串

使用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

该解决方案只需一行就可以实现得更简单:

 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);

您可以使用System.IO名称空间中的Path类:

string filePath = "F:/jan11/MFrame/Templates/feb11";
Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));

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

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;
}