先來看幾個需求
需求1:判斷一個字串是否是Email?必須含有@和.、不能以@或者.開始或者結束、@要在最後一個.之前
需求2:從一個文本中提取出所有的Email:我有全部333M的照片,要的給我發email:me@wo.com。我也要you@you.com,123456@163.com,樓主好人:888888@qq.cn。
需求3:提取網頁中的所有圖片、超連結。
看到這樣的需求,是不是很無奈?當掌握Regex之後,一切變得很簡單
1.什麼是Regex,Regex能做什嗎?
Regex是用來進行文本處理的技術,是語言無關的,在幾乎所有語言中都有實現。javascript中還會用到。
一個Regex就是由一般字元以及特殊字元(稱為元字元)組成的文字模式。該模式描述在尋找文字主體時待匹配的一個或多個字串。Regex作為一個模板,將某個字元模式與所搜尋的字串進行匹配。
Regex可以:
字串的匹配、字串的提取、字串的替換
Regex第一步:元字元
. 匹配除\n之外的任何單個字元 例如Regex“b.g”能匹配如下字串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
[ ] 匹配括弧中的任何一個字元 例如Regex“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。
可以在括弧中使用連字號“-”來指定字元的區間來簡化表示,例如Regex[0-9]可以匹配任何數字字元,這樣Regex“a[0-9]c”等價於“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字串;還可以制定多個區間,例如“[A-Za-z]”可以匹配任何大小寫字母,“[A-Za-z0-9]”可以匹配任何的大小寫字母或者數字。
( ) 將 () 之間括起來的運算式定義為“組”(group),並且將匹配這個運算式的字元儲存到一個臨時地區;這個元字元在字串提取的時候非常有用。把一些字元表示為一個整體
有兩個作用:1、改變優先順序;2、定義提取組兩個作用
| :將兩個匹配條件進行邏輯“或”運算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"
*:匹配0至多個在它之前的子運算式,和萬用字元*沒關係。例如Regex“zo*”能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味著能夠匹配任一字元串。
"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括弧改變優先順序)。
+ :匹配前面的子運算式一次或多次,和*對比(0到多次)。例如Regex9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
? :匹配前面的子運算式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。一般用來匹配“可選部分”。
{n} :匹配確定的 n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的兩個“e”。
{n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
{n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”將匹配“seeeeeeeed”中的前三個“e”。
^(shift+6) :匹配一行的開始。例如Regex“^regex”能夠匹配字串“regex我會用”的開始,但是不能匹配“我會用regex”。
^另外一種意思:非!
$ :匹配行結束符。例如Regex“浮雲$” 能夠匹配字串“一切都是浮雲”的末尾,但是不能匹配字串“浮雲呀”
注意這些簡寫運算式是不考慮轉義符的,這裡的\就表示字元\,而不是C#字串層級的\,在C#代碼中需要使用@或者\雙重轉義。區分C#層級的轉移和Regex層級的轉移,恰好C#的轉義符和Regex的轉義符都是\而已。Regex的轉移是在C#之後的(層層盤剝)。把C#的轉義符想成%就明白了。在C#看來@"\-"就是\-這個普通的字串,只不過在Regex分析引擎看來他有了特殊含義。"\\d"或者@"\d"
\d:代表一個數字,等同於[0-9]
\D:代表非數字,等同於[^0-9]
\s:代表分行符號、Tab定位字元等空白字元
\S:代表非空白字元
\w:匹配字母或數字或底線或漢字,即能組成單詞的字元
\W:非\w ,等同於[^\w]
d:digital;s:space、w:word。大寫就是“非”
.Net中的Regex
Regex在.Net就是用字串表示,這個字串格式比較特殊,無論多麼特殊,在C#語言看來都是普通的字串,具體什麼含義由Regex類內部進行文法分析。
Regex(Regular Expression)的主要類:Regex
常用的3種情況:(C#文法)
1、判斷是否匹配:Regex.IsMatch(“字串”,”Regex”)
2、字串提取:Regex.Match(“字串”,“要提取的字串的Regex”); 字串提取(迴圈提取所有): Regex.Matches()
3、字串替換:Regex.Replace(“字串”,”正則”,”替換內容”);
Regex的應用:
取巧的辦法:從ASP.Net的RegularExpressionValidator中抄常用的Regex,工作中一般是從網上找現成的。或者去http://www.regexlib.com/ 搜尋。