正則表達式—RegEx(RegularExpressio)(三)

今日隨筆,繼續寫一點關於正則表達式的 知識。前兩天介紹了正則表達式驗證匹配,提取等一些基本的知識,今天繼續分享下它的另外一個強大的應用:替換(replace)。html

開始以前,仍是要補一下昨天的內容。程序員

在咱們昨天的內容裏,有一個提取組的概念,在上一節中,我麼只用了數值索引來獲取某組的value。咱們還能夠給某個組取一個別名,而後經過別名來找到相應的組的value。正則表達式

咱們還拿昨天的name和age那個例子說明:緩存

 1  //----------------------------------經過數值索引-------------------
 2             string regex = @"name=(\w+)age=(\d{0,2})";
 3             string str = "name=小強age=23";
 4             Match match = Regex.Match(str, regex);
 5 
 6             Console.WriteLine("name:{0},age:{1}", match.Groups[1].Value, match.Groups[2].Value);
 7 
 8             //輸出結果 name:小強,age:23
 9             //----------------------------------end-------------------
10 


11 //-------------------------------------經過別名------------------------------ 12 string regex = @"name=(?<name>\w+)age=(?'age'\d{0,2})"; 13 string str = "name=小強age=23"; 14 Match match = Regex.Match(str, regex); 15 16 Console.WriteLine("name:{0},age:{1}", match.Groups["name"].Value, match.Groups["age"].Value); 17 Console.WriteLine("COUNT:" + match.Groups.Count); 18 for (int i = 0; i < match.Groups.Count; i++) 19 { 20 Console.WriteLine("{0}--------->{1}", i, match.Groups[i].Value); 21 } 22 23 //輸出結果 name:小強,age:23 24 //COUNT:3 25 //0---------->name=小強age=23 26 //1---------->小強 27 //2---------->23

首先,要先說一下這是微軟支持組別名的語法,在PHP,Python中,能夠用(?P﹤name﹥group)來對組進行命名。詞法?P﹤name﹥就是對組(group)進行了命名。其中name是你對組的起的名字。你能夠用(?P=name)進行引用(一會會介紹引用這個東東)。asp.net

NET framework也支持命名組。不幸的是,微軟的程序員們決定發明他們本身的語法,而不是沿用Perl、Python的規則。學習

(?﹤name﹥小強)(?’age’ 23),url

如你所看到的,.NET提供兩種詞法來建立命名組:一是用尖括號「?﹤﹥」,或者用單引號「?'' 」。尖括號在字符串中使用更方便,單引號在ASP代碼中更有用,由於ASP代碼中「﹤﹥」被用做HTML標籤。spa

恩。。。,今天還要補一組別名的另外一個應用:「正則表達式組之重複操做與後向引用.net

  當用「()」定義了一個正則表達式組後,正則引擎則會把被匹配的組按照順序編號,存入緩存。當對被匹配的組進行向後引用的時候,能夠用「\數字」的方式進行引用。「\1」引用第一個匹配的後向引用組,「\2"引用第二個組,以此類推,"\n"引用第n個組。而"\0"則引用整個被匹配的正則表達式自己。咱們看一個例子。code

假設你想匹配一個HTML標籤的開始標籤和結束標籤,以及標籤中間的文本。好比﹤B﹥This is a test﹤/B﹥,咱們要匹配﹤B﹥和﹤/B﹥以及中間的文字。咱們能夠用以下正則表達式:「﹤([A-Z][A-Z0-9]*)[^﹥]*﹥.*?﹤/\1﹥」

首先,「﹤」將會匹配「﹤B﹥」的第一個字符「﹤」。而後[A-Z]匹配B,[A-Z0-9]*將會匹配0到屢次字母數字,後面緊接着0到多個非「﹥」的字符。最後正則表達式的「﹥」將會匹配「﹤B﹥」的「﹥」。接下來正則引擎將對結束標籤以前的字符進行惰性匹配,直到遇到一個「﹤/」符號。而後正則表達式中的「\1」表示對前面匹配的組「([A-Z][A-Z0-9]*)」進行引用,在本例中,被引用的是標籤名「B」。因此須要被匹配的結尾標籤爲「﹤/B﹥」

  

你能夠對相同的後向引用組進行屢次引用,([a-c])x\1x\1將匹配「axaxa」、「bxbxb」以及「cxcxc」。若是用數字形式引用的組沒有有效的匹配,則引用到的內容簡單的爲空。

一個後向引用不能用於它自身。([abc]\1)是錯誤的。所以你不能將﹤﹤\0﹥﹥用於一個正則表達式匹配自己,它只能用於替換操做中。

代碼以下:

            string regex = @"name=(\w+),waihao=\1";
            //string regex = @"([a-c])x\1x\1";
            while (true)
            {
                string str = Console.ReadLine();
                Console.WriteLine(Regex.IsMatch(str, regex));
            }

//輸入:name=小強,waihao=小強
//輸出的是True

好啦,昨天的內容,就補到這,如今讓咱們看看正則表達式中替換的用法。

 

啥也不說,仍是先上例子

            #region 正則表達式字符串替換,將連續的a都替換成a

            ////1.你aaa好aa哈哈a你

            //string msg = "你aaa好aa哈aaaaa哈a你";
            //msg = Regex.Replace(msg, "a+", "a");
            //Console.WriteLine(msg);
            //Console.ReadKey();
            #endregion

            #region 練習2:將連續的-都替換成一個-

            //string msg = "234-----234--------------34------55";
            //msg = Regex.Replace(msg, @"\-+", "-");
            ////Regex.Split();
            //Console.WriteLine(msg);
            //Console.ReadKey();

            #endregion

            #region 替換案例:將hello 'welcome' to 'China'   替換成 hello 【welcome】 to 【China】
            ////hello 【welcome】 to 【China】
            ////'slslls'   【slslls】
            //string msg = "hello 'welcome' to 'China'";
            ////msg.Replace("'","】"
            //正則表達式的替換中也可使用提取組,使用()來分組,使用$n,來引用提取組。
            //msg = Regex.Replace(msg, "'(.+?)'", "【$1】");
            //Console.WriteLine(msg);
            //Console.ReadKey();

            #endregion

替換:顧名思義就是把一個字符串中,與正則表達式模式匹配的地方,給替換成咱們想要的部分。用的是Regex的Replace方法。。。

Replace: 在指定的輸入字符串內,使用指定的替換字符串替換與指定正則表達式匹配的全部字符串。返回結果:一個與輸入字符串基本相同的新字符串,惟一的差異在於,其中的每一個匹配字符串已被替換字符串代替。

在上面的三個例子中,前兩個很簡單了,我就不說了,有一點要注意的是」-「是元字符,因此要轉義一下。

第三個例子我要說一下,這裏要注意兩點,一點事提取組的用法:例子中要把說有用引號包起來的地方都替換成 用【】包起來,那麼咱們先定義一個正則表達式模式regex='(.+?)',這裏咱們把引號之間的內容括了起來做爲一個提取住,而後在replac方法的第三個參數中,咱們能夠用$1代替剛纔那個提取組的內容(由於引號之間的內容是第一組,因此這裏用的是$1)。同時,還要注意一點的就是在」.+「的後面加了一個問號,這就是咱們前面所說的終止貪婪模式,若是不加得話,覺得welcome' to 'China 都屬於"."這個元字符的匹配的範圍內,因此最終匹配的結果將會是hello 【welcome' to 'China】。

Repalce方法有一個重載,第三個參數是穿進去一個委託實例(方法),在這個方法中,你能夠本身定義具體要怎麼替換或者是作相應的操做,而後將string結果返回。這個就先不舉例子了,在從此我會專門寫一個委託的系列和你們分享。

好啦,再給你們上幾個例子,正則表達式就告於段落了,這三篇文章知識講了一些正則表達式的基本用法,和一些應用的列子(在這些應用中,有的正則表達式模式定義的不是很精確,好比上一節中匹配email,上上節中的匹配身份證等等,在這裏主要的目的是舉例子介紹正則表達式,而沒有去寫較精確的匹配模式),它還有更多的應用和用法,你們在工做中繼續探討和學習吧。

 

#region 手機號碼隱去中間四位
            //string msg = "我叫楊中科:13488888888我是蘇坤18999141365。蔣坤:13111111111。";
            //msg = Regex.Replace(msg, @"(\d{3})\d{4}(\d{4})", "$1****$2");
            //Console.WriteLine(msg);
            //Console.ReadKey();
            #endregion

            #region 練習1:將一段文本中的MM/DD/YYYY格式的日期轉換爲YYYY-MM-DD格式 ,好比「個人生日是05/21/2010耶」轉換爲「個人生日是2010-05-21耶」。

            //string msg = "個人生日是05/21/2010耶,TA的生日是:06/09/2000,哦耶耶";

            //msg = Regex.Replace(msg, @"(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2");
            //Console.WriteLine(msg);
            //Console.ReadKey();

            #endregion

            //a+?
            //xaaaaaaaab

            #region 練習2:給一段文本中匹配到的url添加超連接,好比把http://www.test.com替換爲<a href="http://www.test.com"> http://www.test.com</a>。

            //string msg = "好比把http://www.test.com,新浪http://www.sina.com百度http://www.baidu.com網易:http://www.163.com。傳智播客http://net.itcast.cn。";

            //msg = Regex.Replace(msg, @"(http://[a-zA-Z0-9_\-\.&\?]+)", "<a href=\"$1\">$1</a>");
            //Console.WriteLine(msg);
            //Console.ReadKey();
            #endregion

 

恩。。給本身的博客作個廣告吧,這段時間正在寫一個關於asp.net運行機制的系列,但願更多的小夥伴們能夠去給 出指點。

 

【原創】前言  

【原創】asp.net內部原理(一) 第一個版本  

【原創】asp.net內部原理(二) 第二個版本  

 

好啦,親愛的小夥伴們,咱們一塊兒加油吧,堅信個人老師跟我說的一句話,寫程序也是一種藝術,程序員是一名藝術家,而不是苦逼。 ^_^  Come On~~ GO!GO!.

相關文章
相關標籤/搜索