[.NET]透過 Regex.Replace 來置換字串

如果字串可以有個 Pattern 的話,那就可以使用 Regex.Replace 來置換哦

有針對某個 Pattern 的字串來置換的話,直覺會使用 IndexOf or Contains 來搜尋,然後用 Substring 來取代置換。

如果它可以有個 Pattern 的話,那就可以使用 Regex.Replace 來置換哦!

例如要找尋 Z開頭的數值,然後乘以 12 ,如下

ASDC6XZ10 => ASDC6XZ120

aZ103.12X3ADWR => az1237.44X3ADWR

z1.234xxxz1.1 => z14.808xxxz13.2

 

所以我們要找 Z開頭(不分大小寫)的數值(包含有沒有小數),

因為對 Regex 也不太熟,所以參考「Regex allow digits and a single dot」,

組出的Pattern為 [z]\d+(\.\d+)?

而我們是要針對 z 後面的數值做運算,所以可以先找出 z數值 的資料,然後再從 z數值 字串中找出 數值,如下,


//找出 z數值 的資料,並交給 ZMatchReplace Method 取得要置換的字串,然後置換掉再傳出去
static string ZMultiply(string orgValue)
{
	string zPattern = @"[z]\d+(\.\d+)?";
	// 不分大小寫,請用 RegexOptions.IgnoreCase 
	Regex rx = new Regex(zPattern, RegexOptions.IgnoreCase);
	// Regex rx = new Regex(zPattern);
	string result = rx.Replace(orgValue, new MatchEvaluator(ZMatchReplace));
	return result;
}

//找到 z數值 後,再找出 數值,交給 ZMatchReplaceDigi Method 取得要置換的字串,然後置換掉再傳出去
static string ZMatchReplace(Match m)
{
	string result = m.ToString();
	string zSubPattern = @"\d+(\.\d+)?";
	Regex rx = new Regex(zSubPattern);
	result = rx.Replace(result, new MatchEvaluator(ZMatchReplaceDigi));
	return result;
}
	
//找到 數值 後,乘與 12 後,再將值傳出去
static string ZMatchReplaceDigi(Match m)
{
	string result = m.ToString();
	decimal digiValue = 0;
	decimal.TryParse(result, out digiValue);
	const decimal multiplyValue = 12M;
	return (digiValue * multiplyValue).ToString();
}	

 

所以 main 的測試的Code 如下,


static void Main(string[] args)
{
	List<string> testLists = new List<string>() { 
	"ASDC6XZ10"      
	,"SSF11EWQ"
	,"SAVVSS"
	,"GRWW QD"
	,"Z103X3ADWR"
	,"az103.12.11X3ADWR"
	, "abZ1.1XXX"
	, "z1.234xxxz1.1"
	};
	Console.WriteLine("*** Before ***");
	foreach (string s in testLists)
	{
		Console.WriteLine(s);
	}
	Console.WriteLine("*** After ***");
	foreach (string s in testLists)
	{
		Console.WriteLine(ZMultiply(s));
	}
	Console.ReadKey();
}

image

 

如果有更好的方式,請跟大家分享哦! 謝謝!

 

參考資料

Regex allow digits and a single dot

Regex.Replace

C# Regex.Match

尋找並取代後面數字

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^