国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# Regex 深入正則表達式

2019-11-06 06:39:33
字體:
來源:轉載
供稿:網友

正則表達式(Regular exPRessions)是一套語法匹配規則,各種語言,如Perl, .Net和java都有其對應的共享的正則表達式類庫。在.Net中,這個類庫叫做Regex。簡單的說,Regex是從字符窗中查找匹配字符串的應用類。通過Regex,編程人員能夠非常方便的從一段數據中提取自己所需要的數據信息。舉一個簡單的例子,讓大家對Regex有個大概的了解:Regex regex = new Regex(@"/d+"); Match m = regex.Match("fox 9212gold"); Console.WriteLine(m.Value.ToString()); 結果很明顯,regex為我們找到了字符串”fox 9212gold”中的數字字符串,輸出結果為”9212” .對Regex有了一個基本的概念之后,我需要告訴你一個非常好的消息,那就是Regex可以為我們做的遠不止這么一點點,他是一套功能非常強大語法匹配規則。當然,這里還有一個壞消息等著我們,那就是強大功能的語法規則自然需要大量紛繁復雜的keyWord支持,這也為Regex的學習帶來了極大的難度。想要真正掌握正則表達式,可不是幾個sample能夠全部揭示與說明的。

創建一個Regex對象Regex的構造函數有三種,在這里就不討論默認構造函數了。另外兩個構造函數中,一個構造函數接收正則表達式字符串作為入參,另一個以正則表達式字符串和RegexOptions作為入參。如: Regex regex = new Regex("w+$");Regex regex = new Regex("s+", RegexOptions.IgnoreCase | RegexOptions.Multiline);RegexOptions可以為我們提供一些特殊的幫助,比如IgnoreCase能夠在匹配是忽略大小寫,Multiline能夠調整^和$的意義,改為匹配一行的開頭和結尾。上面我們構造了一個正則表達式,只不過我們還沒有用它來做任何事情,馬上我們就可以通過使用下面的幾個方法,實現對字符串對象的操作了。匹配字符串Regex有兩個獲取匹配的方法Match()和Matches(),分別代表匹配一個,匹配多個結果。這里就用Matches來展示一下怎么使用Regex獲取匹配字符串,并將其顯示出來。 public static void showMatches(string expression, RegexOptions option, string ms) { Regex regex = new Regex(expression, option); MatchCollection matches = regex.Matches(ms); //show matches Console.WriteLine("////////////////----------------------------------////////////////"); Console.WriteLine(" string: "{0}"  expression: "{1}"  match result is:", ms, expression); foreach(Match m in matches) { Console.WriteLine("match string is: "{0}", length: {1}",m.Value.ToString(), m.Value.Length); } Console.WriteLine("matched count: {0}", matches.Count); } 方法Matched通過比較入參字符串和正則表達式,找到所有符合的結果,并將結果作為MatchCollection傳出來。這樣,只要簡單的遍歷這個collection,就可以很快的獲得所有的結果。

組的概念

當你獲得這樣的一個字符串”最后比分是:19/24”,你肯定希望有一個正則表達式,他不單能夠找到形如 data1/data2的字符串,還應該能夠直接把data1,data2作為單獨的結果傳送出來。否則你需要再對形如”19/24”的字符串進行分析,才能夠順利得到雙方的比分。顯然,正則表達式不會忽略這個問題,所以他增加了組的概念。你可以把一次搜索的結果分別放入不同的組中,并通過組名或者組的所以分別取得這些組的結果。比如上例,我們就可以用@”(/d+)/(/d+)”作為表達式。來看看結果吧: Regex regex = new Regex(@"(d+)/(d+)"); MatchCollection matches = regex.Matches(@"最后比分是:19/24"); //show matches Console.WriteLine("////////////////----------------------------------////////////////"); foreach(Match m in matches) { //Console.WriteLine("match string is: "{0}", length: {1}", // m.Value.ToString(), m.Value.Length); foreach(string name in regex.GetGroupNames()) { Console.WriteLine("  capture group "{0}" value is:"{1}"" , name, m.Groups[name].Value); } } Console.WriteLine("matched count: {0}", matches.Count); 輸出:////////////////----------------------------------////////////////capture group "0" value is:"19/24"capture group "1" value is:"19"capture group "2" value is:"24"matched count: 1

現在清楚了吧,Regex對象把匹配的結果放入組0中。同時,匹配的組信息也放入了對應的組中。組的名稱在默認的情況下,是從1開始依次增加的整數。0作為保留名稱,專門用于指示匹配的整個字符串。既然有”默認情況”這樣的概念,自然也就意味著用戶可以自定義組的名稱。方法很簡單,在組的前面加上:?<name>就可以了。好了,現在把前面的正則表達式修改一下,換成@”(?<score1>/d+)/(?<score1>/d+)”,現在再看看結果:////////////////----------------------------------////////////////capture group "0" value is:"19/24"capture group "score1" value is:"19"capture group "score2" value is:"24"matched count: 1

換成自己定義的名字了吧,哈哈!為了在今后的測試中,能夠更加方便的看到所有結果,我們對前面介紹過的showMatches()做一點小小的調整。這樣,如果在表達式中包含了組的定義,我們也可以在不需要修改任何代碼的情況下,直接看到所有的組信息了,調整后的方法showMatchesPro()如下:

public static void showMatchesPro(string expression, RegexOptions option, string ms) { Regex regex = new Regex(expression, option); MatchCollection matches = regex.Matches(ms); //show matches Console.WriteLine("////////////////----------------------------------////////////////"); Console.WriteLine(" string: "{0}"  expression: "{1}"  match result is:",ms, expression); foreach(Match m in matches) {   foreach(string name in regex.GetGroupNames()) { Console.WriteLine("  capture group "{0}" value is:"{1}"",name, m.Groups[name].Value); } } Console.WriteLine("matched count: {0}", matches.Count); // show group name Console.WriteLine("group name count {0}", regex.GetGroupNames().Length); foreach(string name in regex.GetGroupNames()) { Console.WriteLine("group name :"{0}"", name); } } 替換字符串Regex也提供了方便的匹配結果替換的功能。為了方便測試,我們也把他寫成方法,代碼如下:

public static string replaceMatch(string expression, RegexOptions option, string ms, string rep) { Regex regex = new Regex(expression, option); string result = regex.Replace(ms, rep); Console.WriteLine("////////////////----------------------------------////////////////"); Console.WriteLine("string: "{0}", expression:"{1}", replace by : "{2}"", ms, expression, rep); Console.WriteLine("replace result string is: "{0}", length: {1}", result.ToString(), result.Length); return result; }

Regex.Replace通常接受兩個string作為入參,第一個string為輸入字符串。第二個字符串用來替代匹配字符串,它可以包含一些特殊字符串,用來代表特別轉換。

特殊字符串 替換結果$& 匹配的字符串,也可以用$0$1, $2, . . . 匹配字符串中的對應組,用索引標示${name} 匹配字符串中的對應組,用名稱標示$‘ 匹配位置之前的字符串$’ 匹配位置之后的字符串$$ 一個‘$’ 字符$_ 輸入字符串$+ 匹配字符串的所有組中,最后一個組中的數據

是不是看了這么多怪型怪狀的特殊字符串,有點頭暈了?嗯,那就弄兩個sample來看看結果吧!Sample1: replaceMatch(@"/d+", RegexOptions.None, "fef 12/21 df 33/14 727/1", "<<$&>>");輸出,所有數字型的數據都被替換成了<<data>>:////////////////----------------------------------////////////////string: "fef 12/21 df 33/14 727/1", expression:"/d+", replace by : "<<$&>>"replace result string is: "fef <<12>>/<<21>> df <<33>>/<<14>> <<727>>/<<1>>",length: 50

Sample2:replaceMatch(@"(/d+)/(/d+)", RegexOptions.None, "fef 12/21 df 33/14 727/1", "$+");輸出,所有data1/data2匹配的數據,都被替換成了data2:////////////////----------------------------------////////////////string: "fef 12/21 df 33/14 727/1", expression:"(/d+)/(/d+)", replace by : "$+"replace result string is: "fef 21 df 14 1", length: 16

怎么樣,Regex的功能夠豐富的吧!可是,也許你的需求不光這么簡單,比如說,你要把”I have 200 dollars”中間的money加倍,怎么辦?我暈倒,好像沒有現成的東西可以用。沒有關系,Regex還有更好的功能。它允許你自己定義轉換公式。 using System.Text.RegularExpressions; class RegularExpressions { static string CapText(Match m) { // Get the matched string. string x = m.ToString(); // double this value string result = (int.Parse(x) * 2).ToString(); return result; } static void Main() { string text = "i have 200 dollars"; string result = Regex.Replace(text, @"d+",new MatchEvaluator(RegularExpressions.CapText)); System.Console.WriteLine("result=[" + result + "]"); } } 看看結果,太好了,我的錢真的變成了兩倍!但本文的目的是希望提供給大家一個方便好用的測試類,因此我們重載上面的repalceMatch方法,也允許自定義轉換公式作為入參:

public static string replaceMatch(string expression, RegexOptions option, string ms, MatchEvaluator evaluator) { Regex regex = new Regex(expression, option); string result = regex.Replace(ms, evaluator); Console.WriteLine("////////////////----------------------------------////////////////"); Console.WriteLine("string: "{0}", expression:"{1}", replace by a evaluator.", ms, expression); Console.WriteLine("replace result string is: "{0}", length: {1}", result.ToString(), result.Length); return result; } 拆分字符串

Regex還提供了從匹配位置將字符串拆分的方法Split。這個方法同樣具有多個重載,不過這些都不是重點,大家可以自己看文檔。我們繼續完成我們用于測試的方法:public static void splitMatch(string expression, RegexOptions option, string ms) { Regex regex = new Regex(expression, option); string[] result = regex.Split(ms); Console.WriteLine("////////////////----------------------------------////////////////"); Console.WriteLine("string: "{0}", expression: "{1}", split result is:", ms, expression); foreach(string m in result) { Console.WriteLine("splited string is: "{0}", length: {1}",m.ToString(), m.Length); } Console.WriteLine("splited count: {0}", result.Length); } 代碼簡單,不多做解釋。直接來一個smaple看看結果:splitMatch(@"/",RegexOptions.None, "2004/4/25");輸出:////////////////----------------------------------////////////////string: "2004/4/25", expression: "/", split result is:splited string is: "2004", length: 4splited string is: "4", length: 1splited string is: "25", length: 2splited count: 3

這個文章的目的很簡單:介紹Regex的幾個主要功能(匹配、替換和拆分),并提供幾個簡單方便的測試函數。讓你能夠測試你對正則表達式的理解是否準確。

比如想要確認^$的作用,你可以放入這樣的(input, expression)數據:(“123”, “^/d+$”) (“123aaa456”, “^/d+”) (“123aaa456”, “123&”)

確認/d, /s, /w, /W的作用,可以這樣測試:(“123abc gc 456”, “/d+”)(“123abc gc 456”, “/s+”)(“123abc gc 456”, “/w+”)(“123abc gc 456”, “/W+”)

比較? + *之間的區別可以用這樣的數據:(“a123 abcd”, “a/d?”) (“a123 abcd”, “a/d+”) (“a123 abcd”, “a/d*”)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仁怀市| 运城市| 山阳县| 镇雄县| 平南县| 桂阳县| 鄂尔多斯市| 金华市| 深泽县| 诏安县| 东乡县| 西乌| 彩票| 民勤县| 陆良县| 建瓯市| 中超| 七台河市| 鞍山市| 寻甸| 闽侯县| 广德县| 筠连县| 调兵山市| 轮台县| 望江县| 永嘉县| 昆明市| 哈巴河县| 陵川县| 卢龙县| 尼玛县| 揭西县| 江陵县| 怀远县| 南投县| 淄博市| 铅山县| 合肥市| 图们市| 平顶山市|