---------------------- ASP.Net+Android+IO開發S、.Net教育訓練、期待與您交流! ----------------------
什麼是正規表達式
在編寫處理字元串的程式或網頁時,經常會有查找符合某些複雜規則的字元串的需要。正規表達式就是用于描述這些規則的工具。換句話說,正規表達式就是記錄文本規則的代碼。
這是一道題,判斷字元串是否為正确的國内電話号碼,不考慮分機。比如“010-95555”、“01095555”、“95555”都是正确的号碼。區号為3位或者4位。
一開始我做的話,是想先看電話号碼裡面是否有‘-’,有的話再通過分離‘-’去判斷其他的長度是否符合,是否都是數字;沒有的話則判斷長度是否符合,是否都是數字,這是我寫的代碼
static void Main(string[] args)
{
Console.WriteLine("請輸入電話号碼");
string phonenumber = Console.ReadLine();//定義一個string類型的phonenumber接收使用者輸入的電話号碼
if (phonenumber.IndexOf('-') == -1)//電話号碼中沒有'-'的情況
{
if (IsNumber(phonenumber)==true)
{
//判斷字元串長度是否正确,當字元串長度為5.8.9,号碼是正确的
if (phonenumber.Length == 5 || phonenumber.Length == 8 || phonenumber.Length == 9)
{
Console.WriteLine("你輸入的電話号碼是正确的國内電話号碼");
}
else//字元串長度不正确
{
Console.WriteLine("你輸入的電話号碼長度不合法");
}
}
else//當不是正整數的時候
{
Console.WriteLine("你輸入的電話号碼錯誤");
}
}
else//當電話号碼中包含'-'的情況
{
string[] newphone = phonenumber.Split('-');
string firstnewphone = newphone[0];
string lastnewphone = newphone[1];
//如果分離後的字元串長度錯誤
if ((firstnewphone.Length != 3 && firstnewphone.Length != 4) || lastnewphone.Length != 5)
{
Console.WriteLine("你輸入的電話号碼錯誤");
}
else//如果字元串長度正确
{
//調用IsNumber方法判斷是否都是正整數,如果是的話
if (IsNumber(firstnewphone) == false || IsNumber(lastnewphone) == false)
{
Console.WriteLine("你輸入的電話号碼錯誤");
}
else//如果不是正整數
{
Console.WriteLine("你輸入的電話号碼是正确的國内電話号碼");
}
}
}
Console.ReadKey();
}
static bool IsNumber(string str)//定義一個bool類型的方法,判斷傳進來的字元串是否都是正整數
{
char[] toNumber = str.ToCharArray();//把傳進來的字元串轉化成一個字元數組
for (int i = 0; i < toNumber.Length;i++)
{
if (toNumber[i] > 57 || toNumber[i] < 48)
{
return false;
}
}
return true;
}
雖然寫出來了,但是過于複雜,當時發現有人推薦用正規表達式,說可以簡化很多,但當時還不是很明白,是以就這樣寫出來。後來寫完後有時間,在http://deerchao.net/tutorials/regex/regex.htm這裡就仔細的看了下正規表達式的大概,發現可以簡化很多
static void Main(string[] args)
{
string testPhone = Console.ReadLine(); //輸入測試号碼
if (IsPhone(testPhone) == true)
{
Console.WriteLine("正确的");
}
else
{
Console.WriteLine("錯誤的");
}
Console.ReadKey();
}
public static bool IsPhone(string strphone)
{
return Regex.IsMatch(strphone, @"^0\d{2}[- ]?\d{5}$|^0\d{3}[- ]?\d{5}$|^\d{5}$");
}
這樣的話就可以很簡單了。
下面是摘抄的一些基本知識
\b是正規表達式規定的一個特殊代碼(某些人叫它元字元),代表單詞的開頭或結尾。.是另一個元字元比對換行符以外任意字元。*也是元字元,它指定*前面的内容可以連續重複使用人一次。.*連在一起就意味着任意數量的不包含換行的字元。\d+比對1個或更多連續的數字。這裡的+是和*類似的元字元,不同的是*比對重複任意次(可能是0次),而+則比對重複1次或更多次。
下面是些常用的元字元
代碼 | 說明 |
---|---|
. | 比對除換行符以外的任意字元 |
\w | 比對字母或數字或下劃線或漢字 |
\s | 比對任意的空白符 |
\d | 比對數字 |
\b | 比對單詞的開始或結束 |
^ | 比對字元串的開始 |
$ | 比對字元串的結束 |
代碼/文法 | 說明 |
---|---|
* | 重複零次或更多次 |
+ | 重複一次或更多次 |
? | 重複零次或一次 |
{n} | 重複n次 |
{n,} | 重複n次或更多次 |
{n,m} | 重複n到m次 |
代碼/文法 | 說明 |
---|---|
\W | 比對任意不是字母,數字,下劃線,漢字的字元 |
\S | 比對任意不是空白符的字元 |
\D | 比對任意非數字的字元 |
\B | 比對不是單詞開頭或結束的位置 |
[^x] | 比對除了x以外的任意字元 |
[^aeiou] | 比對除了aeiou這幾個字母以外的任意字元 |
分類 | 代碼/文法 | 說明 |
---|---|---|
捕獲 | (exp) | 比對exp,并捕獲文本到自動命名的組裡 |
(?<name>exp) | 比對exp,并捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp) | |
(?:exp) | 比對exp,不捕獲比對的文本,也不給此分組配置設定組号 | |
零寬斷言 | (?=exp) | 比對exp前面的位置 |
(?<=exp) | 比對exp後面的位置 | |
(?!exp) | 比對後面跟的不是exp的位置 | |
(?<!exp) | 比對前面不是exp的位置 | |
注釋 | (?#comment) | 這種類型的分組不對正規表達式的處理産生任何影響,用于提供注釋讓人閱讀 |
代碼/文法 | 說明 |
---|---|
*? | 重複任意次,但盡可能少重複 |
+? | 重複1次或更多次,但盡可能少重複 |
?? | 重複0次或1次,但盡可能少重複 |
{n,m}? | 重複n到m次,但盡可能少重複 |
{n,}? | 重複n次以上,但盡可能少重複 |
元字元^和$都比對一個位置,這和\b有點類似。^比對你要用來查找的字元串的開頭,$比對結尾。如一個網站如果要求你填寫的QQ号必須為5位到12位數字時,可以使用:^\d{5,12}$。
正規表達式引擎會提供一個“測試制定的字元串是否比對一個正規表達式”的方法,DotNet裡面的是Regex.IsMatch()方法。
[aeiou]就比對任何一個英文元音字母,[.?!]比對标點符号(.或?或!)。
像[0-9]代表的含意與\d就是完全一緻的:一位數字;同理[a-z0-9A-Z_]也完全等同于\w(如果隻考慮英文的話)。
(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能比對表達式exp。比如\b\w+(?=ing\b),比對以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會比對sing和danc。
(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能比對表達式exp。比如(?<=\bre)\w+\b會比對以re開頭的單詞的後半部分(除了re以外的部分),例如在查找reading a book時,它比對ading。
零寬度負預測先行斷言(?!exp),斷言此位置的後面不能比對表達式exp。例如:\d{3}(?!\d)比對三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b比對不包含連續字元串abc的單詞。
同理,我們可以用(?<!exp),零寬度負回顧後發斷言來斷言此位置的前面不能比對表達式exp:(?<![a-z])\d{7}比對前面不是小寫字母的七位數字。
a.*b,它将會比對最長的以a開始,以b結束的字元串。如果用它來搜尋aabab的話,它會比對整個字元串aabab。這被稱為貪婪比對。
a.*?b比對最短的,以a開始,以b結束的字元串。如果把它應用于aabab的話,它會比對aab(第一到第三個字元)和ab(第四到第五個字元)。
---------------------- ASP.Net+Android+IOS開發、.Net教育訓練、期待與您交流! ----------------------