C#自定義字符串替換Replace方法實例
本文實例講述了C#自定義字符串替換Replace方法。分享給大家供大家參考。具體實現(xiàn)方法如下:
一、問題:
前一陣遇到一個如標題的算法題,是將原有字符串的某些片段替換成指定的新字符串片段,例如將源字符串:abcdeabcdfbcdefg中的cde替換成12345,得到結(jié)果字符串:ab12345abcdfb12345fg,即:abcdeabcdfbcdefg -> ab12345abcdfb12345fg。
二、實現(xiàn)方法:
顯然不能用string.Replace方法,需要自定義一個方法 string Replace(string originalString, string strToBeReplaced, string strToReplace),下面是我的實現(xiàn)代碼,在半個小時內(nèi)完成,通過了調(diào)試和常規(guī)數(shù)據(jù)的測試驗證,還算是及格吧。
public static string Replace(string originalString, string strToBeReplaced, string strToReplace)
{
string resultString = null;
char[] originalCharArray = originalString.ToCharArray();
char[] strToBeCharArray = strToBeReplaced.ToCharArray();
char[] strToCharArray = strToReplace.ToCharArray();
List<Char> newCharList = new List<Char>();
for (int i = 0; i < originalCharArray.Count(); i++)
{
if (originalCharArray[i] == strToBeCharArray[0])
{
bool IsReplace = false;
for (int j = 0; j < strToBeCharArray.Count(); j++)
{
if (((i + j) < originalCharArray.Count())
&& (originalCharArray[i + j] == strToBeCharArray[j]))
{
IsReplace = true;
}
else
{
IsReplace = false;
break;
}
}
if (IsReplace)
{
i += strToBeCharArray.Count() - 1;
for (int k = 0; k < strToCharArray.Count(); k++)
{
newCharList.Add(strToCharArray[k]);
}
}
else
{
newCharList.Add(originalCharArray[i]);
}
}
else
{
newCharList.Add(originalCharArray[i]);
}
}
resultString = string.Join("", newCharList);
return resultString;
}
因為有時間限制的要求,我沒有添加注釋,不過代碼量不算多,邏輯也算簡單清晰,沒有注釋也OK啦,缺點是算法復(fù)雜度比較高。下面經(jīng)過本人同意,轉(zhuǎn)載一下同事Hello Kitty同學(xué)對同一問題的實現(xiàn)代碼, 也換一種思路來解決同一個問題。代碼稍多,也添加了一些附加功能,各種注釋也很完備,當(dāng)然也需要花費更多時間。歡迎大家有興趣一同討論此話題! PS:就在剛才還發(fā)現(xiàn)了下面代碼的一個bug,就當(dāng)是隱藏彩蛋了!
public class Replace
{
/// <summary>
/// Replace 方法
/// </summary>
/// <param name="source">原字符串</param>
/// <param name="find">需要查找的字符串</param>
/// <param name="replace">替換的字符串</param>
/// <returns>最終替換成功的字符串</returns>
public string Replace(string source, string find, string replace)
{
// 要查找的字符串大于原來字符串,則不處理,返回原來字符
if (find.Length > source.Length)
{
return source;
}
// 記錄找到多少次
int findCount = 0;
// 僅用于標記,輔助記錄多少次
bool flag = true;
// n:source字符串遍歷的數(shù)值;j:find字符串遍歷的數(shù)值
int n = 0, j = 0;
// s:查找到字符串的開始索引,e:查找到字符串的結(jié)束索引
int s = 0, e = 0;
while (true)
{
// 判斷字符是否相等
if (source[n] == find[j])
{
// Source 序列+1
n++;
// 判斷是否為第一位相匹配
if (j == 0)
{
// 賦值給s,查找到頭的索引
s = n;
}
// 查找到后下一次比較find的下一位
j++;
// 標記暫時找到前面相同的字符
flag = true;
}
else
{
// 記錄不完全匹配
flag = false;
// find的索引歸零
j = 0;
// Source的索引繼續(xù)想加
n++;
}
// 已經(jīng)查找完畢
if (j == find.Length)
{
// 完全匹配
if (flag)
{
// 查找的字符數(shù)量+1
findCount++;
}
// 記錄查找的數(shù)組結(jié)尾索引
e = n;
// source 索引繼續(xù)+1
n++;
// find的索引歸零
j = 0;
// 計算生成新字符串,之后繼續(xù)循環(huán),直到替換所有字符串
source = GetNewString(source, find, replace, s, e);
}
// Source遍歷完畢,則退出循環(huán)
if (n >= source.Length)
{
break;
}
}
// 最終字符串
return source;
}
/// <summary>
/// 獲得新的字符串
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="find">需要查找的字符</param>
/// <param name="replace">需要替換的字符</param>
/// <param name="startIndex">查找到的字符開始索引</param>
/// <param name="endIndex">查找到的字符結(jié)束索引</param>
/// <returns>返回替換后的字符串</returns>
public string GetNewString(string source, string find, string replace, int startIndex, int endIndex)
{
// 新字符串的長度
int newArrayLength = source.Length + endIndex - startIndex;
// 新字符數(shù)組
char[] newStringArray = new char[newArrayLength];
// 將前半部分復(fù)制給新字符串
for (int i = 0; i < startIndex - 1; i++)
{
newStringArray[i] = source[i];
}
// 當(dāng)前臨時開始索引
int tempCurrentStartLength = startIndex - 1;
// 將需要替換的賦值給新的字符數(shù)組
for (int i = tempCurrentStartLength; i < tempCurrentStartLength + replace.Length; i++)
{
newStringArray[i] = replace[i - tempCurrentStartLength];
}
// 將之后剩余的字符賦值給新的數(shù)組
for (int i = endIndex + 1; i < newArrayLength; i++)
{
newStringArray[i] = source[i - 1];
}
// 返回轉(zhuǎn)換后的字符串
return string.Concat(newStringArray);
}
}
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
C#實現(xiàn)JWT無狀態(tài)驗證的實戰(zhàn)應(yīng)用解析
這篇文章主要介紹了C#實現(xiàn)JWT無狀態(tài)驗證的實戰(zhàn)應(yīng)用解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03