我有一个问题,我需要替换字符串中最后一个单词。
情况:我收到一个字符串,格式为:
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
- 这不是问题。
答案 0 :(得分:144)
这是替换最后一次出现的字符串
的函数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
是您要替换它的字符串。答案 1 :(得分:11)
使用string.LastIndexOf()
查找字符串最后一次出现的索引,然后使用子字符串查找解决方案。
答案 2 :(得分:7)
您必须手动进行替换:
int i = filePath.LastIndexOf(TnaName);
if (i >= 0)
filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);
答案 3 :(得分:2)
我不明白为什么不能使用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
答案 4 :(得分:0)
仅需一行即可实现该解决方案:
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);
答案 5 :(得分:0)
var lastIndex = filePath.LastIndexOf(TnaName);
filePath = filePath.Substring(0, lastIndex);
答案 6 :(得分: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;
}
答案 7 :(得分:-1)
您可以使用Path
名称空间中的System.IO
类:
string filePath = "F:/jan11/MFrame/Templates/feb11";
Console.WriteLine(System.IO.Path.GetDirectoryName(filePath));