LZ菜鳥,僅整理筆記,順帶記錄一下,謂之增加印象。
LZ認為,沒必要太糾結原理,模型, 屌絲能用就對了,剩下的事情用多了自然會去探索。
中文:正則表達式,英文:Regular ExPression,也叫匹配模式(pattern),用來檢驗字符串是否滿足特定的規則,或從字符串捕獲滿足特定規則的子串。
字符匹配
最簡單的正則表達式由“普通字符”和“通配符”組成。比如“Room\d\d\d”就是這樣的正則表達式。
其中 “Room” 是普通字符,而“\d”是通配符,表示該位置上有一個數字。該表達式一共占用了7個位置,第一個位置上是字母“R”,而第二個和第三個位置上都是位置“o”,第四個位置上是“m”,而第五個到第七個位置上是三個數字。所以正則表達式“Room\d\d\d”代表著以“Room”開頭,以三個數字結尾的那一類字符串。比如字符串”Room010”,"Room111"都與“Room\d\d\d”匹配。
這些特殊字符在正則表達式中稱為元字。因為符號“ . ”在正則表達式裡已有特殊符用處,所以要想表達“ . ”本身,需要使用它的轉移符 “ \. ”,同樣表達符號 ”\“本身,需要使用它的轉移符”\\“。
.NET提供了一批與正則表達式相關的類,它們都位於 using System.Text.RegularExpressions 命名空間裡,現在我們來看下Regex類。
Regex類的部分方法
通過Regex.Matches()方法,可以從給定字符串中分解出所有與正則表達式匹配的子串,這些子串被保存在一個MatchCollection 型的集合中,每個子串都被看做Match類的對象。現在假設某份電子文件裡包含著Kitty的房間號(格式如前面的 RoomXXX),檔案很長,人工查閱費時費力,那麼如何通過計算機幫我們找到房間號呢? 是時候祭出正則兄了!
小例子時間到了:
//命名空間 using System.Text.RegularExpressions; string text = "kitty住在room415,tonny住在room332"; Regex expression = new Regex(@"room\d\d\d"); MatchCollection mathes = expression.Matches(text);//匹配的結果是一個集合 foreach(Match match in mathes) Console.WriteLine(match); Match match1 = expression.Match(text);//匹配結果是單個 Console.WriteLine(match1); Console.WriteLine(match1.NextMatch());//下一個匹配 bool match2= expression.IsMatch(text);//是否有匹配 Console.WriteLine(match2);
@前綴和轉移字符
我們前面學習過控制文本格式的轉移字符,如” \n “ " \" " " \t " " \\ "等,現在又學習了正則表達式的轉移字符,如 " \. " " \w " " \d " " \s " " \\ "等,在正則中它們是有區別的。
Regex exoression=new Regex("\d");
這樣寫就會出現錯誤,因為反斜槓 ” \ “ 本身就是一個特殊的字符,要想表示反斜槓本身,需要使用它的轉移符 ” \\ “ ,所以需要寫成下面的形式:
Regex expression =new Regex("\\d");
但是這種形式會降低可讀性,所以我們通常使用加 @ 前綴的方式。
Regex expression =new Regex(@"\d");
這時會忽略控制文本的格式的轉移符,但不忽略正則表達式的轉移符。
添加前綴@後,如果字符串裡需要引用雙引號本身,就可以用連續的雙引號來表示。
Regex expression=new Regex(@"Say ""Hello"" ")
@可選字符集
除了通配符外,我們還可以把某個位置上允許出現的字符卸載方括號 [] 內,組成可選字符集,比如:
//可選字符: string text = "Vitor-1970 Verne-1982 Regan-1998 Robin-2008"; Regex regex = new Regex(@"[VR][a-z]+-19[89][0-9]");//[VR][a-z]第一個字符V或者R,第二個字符a到z,+ 號表示後面都是a-z foreach (Match match in regex.Matches(text)) Console.WriteLine(match); 反向字符: string text2 = "dog bod fog hog log"; Regex regex2 = new Regex(@"[^bd]og"); //第一個字符非b或者d foreach(var match in regex2.Matches(text2))
{
Console.WriteLine(match);
} Console.WriteLine(match);
或匹配符
string text3 = "there is a bee in the tree"; Regex regex3 = new Regex(@"(tr|b)ee"); //tr或者b+ee foreach (var match in regex3.Matches(text3)) Console.WriteLine(match);
Tips:鑒於正則表達式難以書寫,常用的我們可以百度,入匹配注冊信息之類的,如果自己編寫不靠譜,可以使用 "Regex Tester"工具來測試。