asp.net 替换字符串中最后一个出现的单词- C#

2uluyalo  于 2023-03-13  发布在  .NET
关注(0)|答案(7)|浏览(181)

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

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

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

然后我将TnaName替换为:

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

这是可行的,但是当TnaNamefolder name相同时,我遇到了一个问题,当这种情况发生时,我最终得到了一个如下所示的字符串:

F:/feb11/MFrame/Templates/feb11

现在它已经用feb11替换了TnaName的两个匹配项,有没有办法只替换字符串中最后一个匹配项?

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

kpbpu008

kpbpu0081#

下面是替换最后一个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是要替换它的字符串。
uidvcgyl

uidvcgyl2#

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

iqjalb3h

iqjalb3h3#

您必须手动执行替换:

int i = filePath.LastIndexOf(TnaName);
if (i >= 0)
    filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
lrl1mhuk

lrl1mhuk4#

我不明白为什么不能使用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
jhdbpxl9

jhdbpxl95#

该解决方案甚至可以更简单地通过一行代码来实现:

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

kmpatx3s6#

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

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

Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));
r3i60tvu

r3i60tvu7#

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

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

相关问题