문자열에서 단어의 마지막 항목을 바꿔야하는 문제가 있습니다.
상황 : 다음 형식의 문자열이 제공됩니다.
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
– 문제가되지 않습니다 다른 프로세스에서 유래한다.
답변
다음은 문자열의 마지막 발생을 대체하는 함수입니다.
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
바꿀 문자열입니다.
답변
을 사용 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
답변
네임 스페이스 의 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);