C# 正規表達式(Regular Expression) 電話驗證 身分證字號驗證 Replace字元中間
正規表達式(Regular Expression)
通常適用於比對字串是否符合指定格式,常用於如檢測身分證字號(英文+9碼數字)等固定字串
最常使用的建構函式大致上是這兩個
Regex regex = new Regex(string pattern);
Regex regex = new Regex(string pattern, RegexOptions options);
string pattern 是字串規則
RegexOptions options 是比對方法 大小寫 是否全部相同等等
以下是字串規則 比對規則可以透過這裡去選自己想要的方法
字元部分
Regex.IsMatch("string" , @"^09[0-9]{8}$" );
這段的意思是 09 ^開頭 接{8}個[0-9]的數字後 $結尾
接著是驗證身分證字號部分
中華民國身分證字號規則為
@"^[A-Z]{1}[1-2]{1}[0-9]{8}$"
A~Z開頭一個 然後1或2(男女別) 接著亂碼最後一碼檢查碼
計算方式為
A 為 10 以此遞增 1 也就代表B 為 11
因此比對A為1 or 2
接著把英文轉數字後會得到一個十位數,再把個位數 * 9 與十位數相加,如 F = 15 = 5 * 9 + 1 = 46 > Esum
然後再依序把後面的數字 123 456 784 乘以 8 ~ 0
也就是 8+14+18+20+20+18+14+8+0 = 120 > Nsum
接著 10 - (Esum + Nsum % 10) 得到的數字會與最後一碼相同
因此 F123456784 就是一組新北市出生的男姓身分證了
以下為code 參考
這篇有問題的地方在於紅字處
因為大多數使用者其實很懶 有時候他打個小寫就進來了,但是因為你的正規表示已經強制大寫了 所以紅字就不需要了
而如果要不限大小寫 應該把紅字處上移至藍標處
while (true)//方便連續測試用
{
Console.WriteLine("==請輸入身份證字號==");
string typein = Console.ReadLine();
//以下開始解法一
string checkID = "";
int Esum = 0;
int Nsum = 0;
int count = 0;
//{blue point}
bool flag = Regex.IsMatch(typein, @"^[A-Z]{1}[1-2]{1}[0-9]{8}$");//先判定是否符合一個大寫字母+1或2開頭的1個數字+8個數字
//先用正規運算式判斷是否符合格式
typein = typein.ToUpper();//把字母轉成大寫
if (flag)//如果符合第一層格式
{ //宣告一個陣列放入A~Z相對應數字的順序
string[] country = new string[] { "A","B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "X", "Y", "W", "Z", "I", "O" };
for (int index = 0; index < country.Length; index++)
{
if (typein.Substring(0, 1) == country[index])
{
index += 10;//A是從10開始編碼,每個英文的碼都跟index差異10,先加回來
Esum = (((index % 10) * 9) + (index / 10));
//英文轉成的數字, 個位數(把數字/10取餘數)乘9再加上十位數
//加上十位數(數字/10,因為是int,後面會直接捨去)
break;
}
}
for (int i = 1; i < 9; i++)
{//從第二個數字開始跑,每個數字*相對應權重
Nsum += (Convert.ToInt32(typein[i].ToString())) * (9 - i);
}
count = 10 - ((Esum + Nsum) % 10);//把上述的總和加起來,取餘數後,10-該餘數為檢查碼,要等於最後一個數字
if (count == Convert.ToInt32(typein[9].ToString()))//判斷計算總和是不是等於檢查碼
{
checkID = "身分證字號正確";
}
else
{
checkID = "身分證字號不存在";
}
}
else
{
checkID = "身分證格式錯誤";
}
Console.WriteLine(checkID);
}
而我開始查正規表達式的原因是因為工作上遇到了一些問題
因為我想使用HTML Editor 方便user自己製作他們要的頁面
但是這個頁面出來會有<html tag> 要單純用string show出來的話會變成<p> 文字 </p>
因此我就在思考怎麼全部刪除那些html tag
var htmlstarttag = new Regex(@"<.{1,5}>");
htmlstarttag.Replace(list.Brief.Substring(0, 100), "");
以下是我的方法 把 <>裡面 1~5個字全部替代 通常的html tag 大概都三個字左右 因此我選了1~5個字
這樣就可以處理 <p> </p> 系列的tag
--------------------------------2023/04/25更新新方法
return Regex.Replace(input, "<[a-zA-Z/].*?>", String.Empty);
這個方法是可以直接處理<>內的文字 a~z A~Z 和 </> 比上述的方法好多了
因為可以處理<img src=> 或者是部份亂複製帶style和class的文字
參考:
https://learn.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expression-language-quick-reference?redirectedfrom=MSDN#character_classes
https://ithelp.ithome.com.tw/articles/10217795
https://learn.microsoft.com/zh-tw/dotnet/api/system.text.regularexpressions.regexoptions?redirectedfrom=MSDN&view=netframework-4.8
留言
張貼留言