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();
}
}
}
輸出之後就是這樣:只要符合驗證規則,就會格式化好
當然要格式化之前可以先加個IsMatch() 傳會布林值,看看是不是符合。
大概就這樣,這種東西看多了也沒用,還是要自己找幾個範例,然後多練習寫幾個規則出來
才能真的了解他的寫法跟用途!!