Regular Expression規則運算式

Regular Expression規則運算式

 

從剛開始學程式的時候,就知道有這個regular expression這個東西了

不過當初打死都不想去研究這個,總覺得一堆怪怪的符號,毫無邏輯可言,怎麼可能記的住學的來

但開始工作之後,才發現這種基本工,不會的話真的很囧

就像JaveScript一樣,以前都覺得別人寫好的Code又完整又漂亮,抓來用就好

自己寫真是太浪費時間,不過,要用的時候,一直Google也不是辦法...真的是書到用時方恨少。

所以下定決心不管三七二十一,只要不懂的,就要把他學會。

 

不過規則運算式的規則真的太多,要一時之間記起來也不容易。所以打算用實例搭配著學比較有感覺

下面先來一段驗證電話號碼的格式:

一般來說,遇到要求要輸入電話號碼,大概有幾種下面輸入方式:

02-0000-0000

02 0000 0000

02 0000-0000

0200000000

(02) 0000 0000

(02) 0000-0000

(02)-0000-0000

 

大概這些吧,那要怎樣用一個規則運算式讓上述全部通過呢?

寫出來的規則運算式是這樣:

 


^\(?\d{2}\)?[\s\-]?\d{4}\-?\d{4}$

應該不少人跟我以前一樣,看到這邊,就Ctrl+C,Ctrl+V 貼回去用,就不看了

不過!! 電話號碼的規則真的算簡單的,花個三分鐘以後就不用再Google自己就可以寫了。

首先拆成好幾個部分來看

 


^  \(?  \d{2}  \)?  [\s\-]?  \d{4}  \-?  \d{4}      $

規則運算式之所以難懂,是因為全部都糊再一起,跟亂碼一樣,任誰都不想看

如果切好的話,就是一段一段的規則

^代表要比對的開始

\(?  代表 ( 可有可無,很容易聯想,一個字元加上一個?就是代表可有可無,最前面的\是跳脫字元

\d{2}   \d代表數字,{2}代表一定要有兩個,連起來也就是一定要有兩個數字

\)?  跟上上行的意思一樣,就是)可有可無,前面加個跳脫字元

[\s\-]?   [ ]可以想成集合,挑選裡面的任一個,\s代表空白,\-就是-加一個跳脫字元,?代表可有可無

整個看下來就是 可以有一個空白或是一個-,或是什麼都沒有

 

\d{4}就是一定要有四個數字

\-?  就是  -可有可無,前面的斜線一樣是跳脫字元

\d{4}就是一定要有四個數字

$代表比對的結束

 

拆開來看的話,其實一個一個的意思還算好懂,如果能自己寫出來,以後遇到電話號碼驗證

就算格式有些變動,應該也可以看的懂了。

再補充一點,如果依上面舉的那七種電話號碼的例子,雖然都能通過,但存到資料庫還是不太好看

這時候就可以重新編排一下格式,只要把規則運算式做一點小改變,再加上一點Code就做得到

 


^\(?(\d{2})\)?[\s\-]?(\d{4})\-?(\d{4})$

看不出來改那裏嗎?那就拆開來看吧!


^ \(? (\d{2}) \)? [\s\-]? (\d{4}) \-? (\d{4}) $

 

改的地方就只有用()把數字的部分包起來而已。有點類似分群組,接下來就寫一小段程式格式化


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;                  //Regex在這個命名空間

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立一個Regex物件,規則直接在建構子傳入
            Regex r = new Regex(@"^\(?(\d{2})\)?[\s\-]?(\d{4})\-?(\d{4})$");
            //讀一個字串進來
            string s = Console.ReadLine();

            Match m = r.Match(s);          //把傳入的文字用Match()方法比對,傳回一個Match的物件

            //格式化字串,用Match.Groups加索引
            string S_retrun = String.Format("({0}) {1}-{2}", m.Groups[0], m.Groups[2], m.Groups[3]);

            Console.WriteLine(S_retrun);      //輸出格式好的字串

            Console.ReadLine();
        }
    }
}

輸出之後就是這樣:只要符合驗證規則,就會格式化好

9a20fa4720be48db9923c7b327d92295

 

當然要格式化之前可以先加個IsMatch() 傳會布林值,看看是不是符合。

大概就這樣,這種東西看多了也沒用,還是要自己找幾個範例,然後多練習寫幾個規則出來

才能真的了解他的寫法跟用途!!