如果字串可以有個 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();
}
如果有更好的方式,請跟大家分享哦! 謝謝!
參考資料
Regex allow digits and a single dot
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^