天天看點

黑馬程式員--正規表達式

 ---------------------- 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次或更多次。

下面是些常用的元字元

表1.常用的元字元

代碼 說明
. 比對除換行符以外的任意字元
\w 比對字母或數字或下劃線或漢字
\s 比對任意的空白符
\d 比對數字
\b 比對單詞的開始或結束
^ 比對字元串的開始
$ 比對字元串的結束

表2.常用的限定符

代碼/文法 說明
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次

表3.常用的反義代碼

代碼/文法 說明
\W 比對任意不是字母,數字,下劃線,漢字的字元
\S 比對任意不是空白符的字元
\D 比對任意非數字的字元
\B 比對不是單詞開頭或結束的位置
[^x] 比對除了x以外的任意字元
[^aeiou] 比對除了aeiou這幾個字母以外的任意字元

表4.常用分組文法

分類 代碼/文法 說明
捕獲 (exp) 比對exp,并捕獲文本到自動命名的組裡
(?<name>exp) 比對exp,并捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp) 比對exp,不捕獲比對的文本,也不給此分組配置設定組号
零寬斷言 (?=exp) 比對exp前面的位置
(?<=exp) 比對exp後面的位置
(?!exp) 比對後面跟的不是exp的位置
(?<!exp) 比對前面不是exp的位置
注釋 (?#comment) 這種類型的分組不對正規表達式的處理産生任何影響,用于提供注釋讓人閱讀

表5.懶惰限定符

代碼/文法 說明
*? 重複任意次,但盡可能少重複
+? 重複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教育訓練、期待與您交流! ----------------------

上一篇: 斷點的種類
下一篇: yuv轉h264