.Net進階技術之Regex

來源:互聯網
上載者:User

先來看幾個需求

需求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/ 搜尋。

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.