精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.NET正則類及其方法應用

開發 后端
本文將和大家探討.NET正則類,特別是正則表達式方面的應用問題。希望對大家不了解的部分能有更多的介紹。

1 概述

初學正則時,對于Regex類不熟悉,遇到問題不知道該用哪種方法解決,本文結合一些正則應用的典型應用場景,介紹一下Regex類的基本應用。這里重點進行.NET類的介紹,對于正則的運用,不做深入探討。

正則的應用最終都是進行模式的匹配,而根據目的的不同,基本上可以分為以下幾種應用:驗證、提取、替換、分割。結合.NET提供的控件、類以及類的方法,可以很方便的實現這些應用。

以下將結合一些典型的應用場景,對.NET中常見的類、方法及屬性進行介紹。本文旨在.NET類基礎用法的引導,對于其中涉及到的正則表達式不做深入探討。本文適合于在.NET平臺下使用正則的初學者。

2 基礎應用

2.1     驗證

驗證的目的是為了判斷輸入的源字符串是否符合某一規律或規則,根據需求的不同,可能是校驗整個源字符串,也可能只是校驗其中一個子串。

驗證在.NET中一般有兩種應用,一種是在驗證控件RegularExpressionValidator中,另一種是在程序中。

2.1.1  驗證控件RegularExpressionValidator
RegularExpressionValidator是.NET自帶的一種客戶端驗證控件,通過簡單的設置,即可完成對某控件輸入值的校驗。

基本應用語法如下:

  1. <asp:RegularExpressionValidator 
  2.       ID="RegularExpressionValidator1" 
  3.       runat="server" 
  4.       ControlToValidate="TextBox1" 
  5.       ErrorMessage="RegularExpressionValidator" 
  6.  ValidationExpression="^([1-9][0-9]*|0)(\.[0-9][2])?$"> 
  7.   </asp:RegularExpressionValidator> 

對于RegularExpressionValidator控件不做過多介紹,只是說明一下使用時需要注意的幾點:

1、  RegularExpressionValidator進行的是客戶端驗證;

2、  RegularExpressionValidator中正則使用的是JavaScript語法規則;

3、  RegularExpressionValidator控件不能驗證輸入是否為空。

由于RegularExpressionValidator做的是客戶端驗證,很容易被跳過,所以在使用RegularExpressionValidator驗證的同時,還要做服務器端驗證。

RegularExpressionValidator最終是要生成客戶端的JavaScript代碼進行驗證的,所以RegularExpressionValidator使用的正則要求符合JavaScript語法規則,與.NET的幾點區別:

1、  不支持逆序環視,也就是(?<=Expression)和(?<!Expression)這樣的語法;

2、  元字符僅支持ASCII碼,即\w等價于[a-zA-Z0-9_],\d等價于[0-9]

RegularExpressionValidator控件一般是用來驗證某一控件輸入的字符串整體是否符合某一規則的,所以通常情況下“^”和“$”是必不可少的;在使用“|”表示“或”的關系時,一定要用“()”來限定“|”作用范圍,比如0-100可以寫作“^([1-9]?[0-9]|100)$”。

RegularExpressionValidator是不能驗證輸入是否為空的,驗證是否為空要用RequiredFieldValidator控件。

RegularExpressionValidator驗證控件是.NET為方便客戶端驗證封裝的一組驗證控件之一,但由于RegularExpressionValidator受限于支持的正則語法規則,只能做有限的格式校驗,一些復雜的校驗可以通過自己寫JavaScript代碼來實現,也是很簡單的。

2.1.2  程序驗證——IsMatch()
程序中的校驗基本上就是使用IsMatch方法,驗證的對象可能是源字符串的整體,也可能只是其中一個子串。

驗證源字符串的整體是否符合某一規則,與使用RegularExpressionValidator時的需求基本上一致,不過由于是在.NET程序中,所以使用的是.NET的語法,比JavaScript中要強大得多。比如驗證一個文本框輸入的字符串是否符合某一規則,就是一個典型的驗證整體的需求。

舉例1:驗證textBox1輸入內容,要求整數部分為0或正整數,小數可有可無,有小數時必須為2位。

  1. Regex reg = new Regex(@"^(?:[1-9][0-9]*|0)(?:\.[0-9]{2})?$");  
  2. if (reg.IsMatch(textBox1.Text))  
  3. {  
  4.     richTextBox2.Text = "輸入格式正確!";  
  5. }  
  6. else 
  7. {  
  8.     richTextBox2.Text = "輸入格式錯誤!";  

由于是對源字符串的整體進行驗證,所以“^”和“$”是必不可少的。否則驗證的結果可能是錯誤的,比如正則表達式“(?:[1-9][0-9]*|0)(?:\.[0-9]{2})?”,在輸入“0.123”時是可以匹配成功的,匹配結果為“0.12”,此時正則只起到了匹配的作用,沒有起到驗證的作用。

驗證源字符串的局部是否符合某一規則,就是對于源字符串中子串的校驗,通常是用來判斷源字符串中是否包含,或是不包含符合某一規律的子串,作用類似于string類中的IndexOf。

舉例2(參考問兩個正則表達式):

數據:

1985aaa1985bb

bcae1958fiefadf1955fef

atijc1944cvkd

df2564isdjfef2564d

abc1234def5678ghi5678jkl

需求1:驗證字符串中任意位置出現的連續四個數字在整個字符串中是否有重復,有重復為True,無重復為False。

以上數據需求1的驗證結果為True的應為:

1985aaa1985bb

df2564isdjfef2564d

abc1234def5678ghi5678jkl

因為需求中指明是任意位置的連續4個數字是否有重復,所以在找到重復前,要遍歷源字符串中每一個位置時行驗證,這樣就不能限定開始標識符“^”;而在匹配過程中,除非一直到結尾仍找不到重復,否則只要匹配到有重復的位置就可以了,這樣也不需要結束標識符“$”,所以這是典型的對字符串的子串行驗證的需求。

代碼實現:

  1. string[] test = new string[] { "1985aaa1985bb""bcae1958fiefadf1955fef"
  2. "atijc1944cvkd""df2564isdjfef2564d""abc1234def5678ghi5678jkl" };  
  3. Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");  
  4. foreach (string s in test)  
  5. {  
  6. richTextBox2.Text += "源字符串:  " + s.PadRight(25, ' ') + "驗證結果:  " + reg.IsMatch(s) + "\n";  
  7. }  
  8. /*--------輸出-------- 
  9. 源字符串:  1985aaa1985bb           驗證結果:  True
  10. 源字符串:  bcae1958fiefadf1955fef  驗證結果:  False
  11. 源字符串:  atijc1944cvkd            驗證結果:  False
  12. 源字符串:  df2564isdjfef2564d      驗證結果:  True
  13. 源字符串:  abc1234def5678ghi5678jkl 驗證結果:  True*/

由于涉及到了重復問題,所以這里用到了反向引用,對于反向引用的細節,可以參考正則基礎之——反向引用。

需求2:驗證字符串中第一個出現的連續4個數字是否有重復,有重復為True,無重復為False。

以上數據需求2的驗證結果為True的應為:

1985aaa1985bb

df2564isdjfef2564d

因為需求中指明是第一個是否有重復,所以需要有開始標識符“^”,來保證是第一個出現的連續4個數字;而在匹配過程中,除非一直到結尾仍找不到重復,否則只要匹配到有重復的位置就可以了,這樣也不需要結束標識符“$”,所以這仍是對字符串的子串行驗證的需求,只不過相對于需求1來說,加了一個限定條件。

代碼實現:

  1. string[] test = new string[] { "1985aaa1985bb""bcae1958fiefadf1955fef",
  2.  "atijc1944cvkd""df2564isdjfef2564d""abc1234def5678ghi5678jkl" };  
  3. Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");  
  4. foreach (string s in test)  
  5. {  
  6.      richTextBox2.Text += "源字符串:  " + s.PadRight(25, ' ') + "驗證結果:  " + reg.IsMatch(s) + "\n";  
  7. }  
  8. /*--------輸出--------  
  9. 源字符串:  1985aaa1985bb            驗證結果:  True  
  10. 源字符串:  bcae1958fiefadf1955fef   驗證結果:  False  
  11. 源字符串:  atijc1944cvkd            驗證結果:  False  
  12. 源字符串:  df2564isdjfef2564d       驗證結果:  True  
  13. 源字符串:  abc1234def5678ghi5678jkl 驗證結果:  False  
  14. */ 

2.2     提取——Match()、Matches()

提取主要是從源字符串中,取得一個或多個符合某一規律或規則的子串。一般來說,在字符串處理中,提取應用比較廣泛。提取時用得比較多的是Match()和Matches()方法,以及結果處理時Match類和MatchCollection類的一些方法,有時也會用到Capture類的一些方法。

2.2.1  提取單次匹配內容——Match()

當需要提取的內容只有一個,或是只需要獲取第一次成功匹配的內容時,可以使用Match()方法。當使用Match()方法時,只要在某一位置匹配成功,就不再繼續嘗試匹配,并返回一個Match類型的對象。

舉例:提取姓名

源字符串:姓名:張三,性別:男,年齡:25

代碼實現:

  1. string test = "姓名:張三,性別:男,年齡:25";  
  2. Regex reg = new Regex(@"(?<=姓名:)[^,]+");  
  3. Match m = reg.Match(test);  
  4. if (m.Success)    //驗證是否匹配成功  
  5. {  
  6.       richTextBox2.Text = m.Value;  
  7. }  
  8. /*--------輸出--------  
  9. 張三  
  10. */ 

雖然Match()只是取一次匹配,但是可以通過捕獲組來獲取多個指定子串,比如獲取第一個<a…>標簽的鏈接和文本。

  1. string test = "abc<a href=\"www.test1.com\">測試一</a>def<a href=\"www.test2.com\">測試二</a>ghi";  
  2. Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""\s>]*)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");  
  3. Match m = reg.Match(test);  
  4. if(m.Success)  
  5. {  
  6.      richTextBox2.Text += m.Groups["url"].Value + "\n";      //鏈接  
  7.      richTextBox2.Text += m.Groups["text"].Value + "\n";     //文本  
  8. }  
  9. /*--------輸出--------  
  10. www.test1.com  
  11. 測試一  
  12. */ 

對于捕獲組捕獲結果的引用,還有一種方式

  1. string test = "abc<a href=\"www.test1.com\">測試一</a>def<a href=\"www.test2.com\">測試二</a>ghi";  
  2. Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""\s>]*)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"); Match m = reg.Match(test);  
  3. if(m.Success)  
  4. {  
  5.      richTextBox2.Text += m.Result("${url}") + "\n";      //鏈接  
  6.      richTextBox2.Text += m.Result("${text}") + "\n";     //文本  
  7. }  
  8. /*--------輸出--------  
  9. www.test1.com  
  10. 測試一  
  11. */ 

這兩種方法獲取的結果都是一樣的,使用哪一種,通常根據個人習慣而定。

2.2.2  提取多次匹配內容——Matches()
當需要提取的內容有多個,并且需要提取所有符合規律的子串時,可以使用Matches()方法。當使用Matches()方法時,需要遍歷源字符串的每一個位置進行嘗試匹配,匹配結束返回一個MatchCollection類型的對象。

對于1.2.1節提到的提取鏈接和文本的例子,如果提取的是全部鏈接和文本,而不僅僅是第一個時,可以使用Matches()方法。

  1. string test = "abc<a href=\"www.test1.com\">測試一</a>def<a href=\"www.test2.com\">測試二</a>ghi";  
  2.  
  3. Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""\s>]*)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");  
  4. MatchCollection mc = reg.Matches(test);  
  5. foreach(Match m in mc)  
  6. {  
  7.      richTextBox2.Text += m.Groups["url"].Value + "\n";      //鏈接  
  8.      richTextBox2.Text += m.Groups["text"].Value + "\n";     //文本  
  9. }  
  10. /*--------輸出--------  
  11. www.test1.com  
  12. 測試一  
  13. www.test2.com  
  14. 測試二  
  15. */ 

對于Matches(),某些場景下,也可以通過Count屬性,用做統計符合某一規律的子串出現的次數,例如統計字符串中獨立的“3”出現的次數。

 

  1. string test = "137,1,33,4,3,6,21,3,35,93,2,98";  
  2. Regex reg = new Regex(@"\b3\b");  
  3. int count = reg.Matches(test).Count;    //2 

 

這時候關心的只是匹配成功的次數,對于匹配的內容是不關心的,所以實現這種需求時,正則應盡量簡潔,能達到目的即可,這樣可以加快匹配效率,減少資源占用。比如上面的提取鏈接的源字符串中,統計<a…>標簽出現的次數,一般來說,如下代碼即可達到目的了。

 

  1. string test = "abc<a href=\"www.test1.com\">
  2. 測試一</a>def<a href=\"www.test2.com\">測試二</a>ghi";  
  3. Regex reg = new Regex(@"(?i)<a\b");  
  4. int count = reg.Matches(test).Count;    //2 

 

2.2.3  捕獲組匹配過程集合——Capture
在某些情況下,一個正則表達式整體匹配一次時,其中的捕獲組可能會匹配多次。

舉例:

源字符串:<region name=oldslist col=1 row=2 order=asc>abcsadf </region> jfdsajf  <region name=newslist class=list col=4 row=10 order=desc>abcsadf </region>

需求:提取出每個region的屬性和屬性值,按region分組。

對于這個需求,可以先提取出所有region,再對每個region標簽提取它的屬性和屬性值,但這樣做比較麻煩,可以考慮在一個正則表達式中提取。由于屬性的個數是不固定的,所以不能用固定個數的量詞來匹配屬性對,正則可以寫為

 

  1. (?is)<region\s+(?:(?<key>[^\s=]+)=(?<value>[^\s>]+)\s*)+> 

此時如果還用Groups來取匹配結果時,由于Groups只保留最后一次匹配結果,所以只能取到最后一次匹配成功的子串。這時就要用到Captures屬性。

 

  1. string test = "<region name=oldslist col=1 row=2 order=asc>abcsadf
  2.  </region> jfdsajf  
  3. <region name=newslist class=list col=4 row=10 order=desc>abcsadf
  4.  </region>";  
  5. MatchCollection mc = Regex.Matches(test, @"(?is)
  6. <region\s+(?:(?<key>[^\s=]+)=(?<value>[^\s>]+)\s*)+>");  
  7. for (int i = 0; i < mc.Count; i++)  
  8. {  
  9.     richTextBox2.Text += "第" + (i + 1) + "個region的屬性:\n";  
  10.     for (int j = 0; j < mc[i].Groups["key"].Captures.Count; j++)  
  11.     {  
  12. richTextBox2.Text += "屬性: " + mc[i].Groups["key"].Captures[j].Value.PadRight(10, ' ')
  13.  + "  值: " + mc[i].Groups["value"].Captures[j].Value + "\n";  
  14.  
  15.     }  
  16.     richTextBox2.Text += "\n";  
  17. }  
  18. /*--------輸出-------- 
  19. 第1個region的屬性:

    屬性: name        值: oldslist

    屬性: col         值: 1

    屬性: row         值: 2

    屬性: order       值: asc

    第2個region的屬性:

    屬性: name        值: newslist

    屬性: class       值: list

    屬性: col         值: 4

    屬性: row         值: 10

    屬性: order       值: desc

    */

Group實際上是Capture的一個集合,在捕獲組只匹配一個子串時,這個集合只有一個元素,而在捕獲組先后匹配多個子串時,Groups[i].Value只保留最后一個匹配結果,而Capture集合卻可以記錄匹配過程中匹配到的所有子串。

Capture的應用場景并不多,對于上面的例子,如果不使用 Capture,可以通過分次匹配的方式實現,但是在一些復雜的表達式中,很難進行分次匹配,這時Capture就比較有用了。

2.3      替換

替換主要是從源字符串中,將符合某一規律或規則的子串替換為其它內容。一般來說,在字符串處理中,替換應用也比較廣泛。替換主要是用Replace()方法,在一些替換規則復雜的應用場景中,也可能會用到委托方法。

2.3.1  一般替換

替換的目的很明確,只要找出待替換子串的規律,替換為目標子串就可以了。

舉例1:

源字符串:<img src="/imgs/logo.jpg"> abc <img src="http://www.test.com/imgs/top.gif">

需求:將相對地址替換為絕對地址,已經是絕對地址的不替換。

 

  1. string test = "<img src=\"/imgs/logo.jpg\"> abc <img src=\"http://www.test.com/imgs/top.gif\">";  
  2. Regex reg = new Regex(@"(?i)(?<=src=(['""]?))(?!http://)(?=[^'""\s>]+\1)");  
  3. string result = reg.Replace(test, "http://www.test.com");  
  4. /*--------輸出--------  
  5. <img src="http://www.test.com/imgs/logo.jpg"> abc <img src="http://www.test.com/imgs/top.gif">  
  6. */ 

 

這里需要說明的是,在.NET中只提供了一個Replace()方法,沒有提供類似于Java中的replaceAll()和replaceFirst()兩種方法,所以如果在.NET中只替換第一次出現的符合規律的子串時,需要在正則表達式中處理。

舉例2:

源字符串:abc123def123ghi

需求:將第一次出現的“123”替換為空,其余位置不替換。

 

  1. string test = "abc123def123ghi";  
  2. Regex reg = new Regex(@"(?s)^((?:(?!123).)*)123");  
  3. string result = reg.Replace(test, "$1");  
  4. /*--------輸出--------  
  5. abcdef123ghi  
  6. */ 

 

這時用“^”限定只替換第一次出現的子串,由于絕大多數正則引擎都對“^”進行了優化,所以正則表達式在位置0處匹配成功或失敗后,將不再對其它位置進行嘗試匹配。

2.3.2  替換中的委托方法應用

對于一些比較復雜的替換規則,可能會用到委托方法,由于這種應用屬于比較典型的一種應用,所以將在后面的文章中單獨進行介紹

2.4     分割

分割就是用符合某一規律的子串,將源字符串分割成一個數組,主要用到的是Split()方法。由于Regex的Split()方法中,并沒有提供類似于string的Split()方法的StringSplitOptions.RemoveEmptyEntries參數,而如果符合規律的子串出現在開頭或結尾時,會出現不需要的空串,這時需要在正則表達式中進行一下處理。

舉例1:

源字符串:漢字123文字english

需求:按英文單詞和非英文單詞進行分割(英文單詞包括由a-z,A-Z,0-9,_組成的子串)。

  1. string str = "漢字123文字english";  
  2. string[] result = Regex.Split(str, @"(?<!^)\b(?!$)", RegexOptions.ECMAScript);  
  3. foreach (string s in result)  
  4. {  
  5.      richTextBox2.Text += s + "\n";  
  6. }  
  7. /*--------輸出--------  
  8. 漢字  
  9. 123  
  10. 文字  
  11. English  
  12. */ 

這里分別用“(?<!^)”和“(?!$)”來限定不以開頭或結尾的子串進行分割,結果中也就不會出現不必要的空串了。

還有一些應用,其實可以算作是正則就用技巧范疇的了。

舉例2:

源字符串:Left(姓名,1),Left(姓名,1) ,  Left    (姓名,1)

需求:以不在“()”內的“,”進行分割。

  1. string test = "Left(姓名,1),Left(姓名,1) ,  Left    (姓名,1)";  
  2. Regex reg = new Regex(@"(?<!\([^)]*),(?![^(]*\))");  
  3. string[] sArray = reg.Split(test);  
  4. foreach (string s in sArray)  
  5. {  
  6.      richTextBox2.Text += s + "\n";  
  7. }  
  8. /*--------輸出--------  
  9. Left(姓名,1)  
  10. Left(姓名,1)  
  11.   Left    (姓名,1)  
  12. */ 

使用正則的Split()方法時,有一點需求注意,那就是如果正則中出現了捕獲組,那么捕獲組匹配到的內容也會保存到分割結果中。

以下舉例不做詳細說明,看下結果基本上就明白了。

  1. string test = "aa11<bbb>cc22<ddd>ee";  
  2. string[] temp = Regex.Split(test, @"[0-9]+(<[^>]*>)");  
  3. foreach (string s in temp)  
  4. {  
  5.      richTextBox2.Text += s + "\n";  
  6. }  
  7. /*--------輸出--------  
  8. aa  
  9. <bbb>  
  10. cc  
  11. <ddd>  
  12. ee  
  13. */ 

 如果不想把捕獲組匹配到的內容也存入結果,可以使用非捕獲組。 

  1. string test = "aa11<bbb>cc22<ddd>ee";  
  2. string[] temp = Regex.Split(test, @"[0-9]+(?:<[^>]*>)");  
  3. foreach (string s in temp)  
  4. {  
  5.      richTextBox2.Text += s + "\n";  
  6. }  
  7. /*--------輸出--------  
  8. aa  
  9. cc  
  10. ee  
  11. */ 

3       擴展應用

這里介紹一些可能涉及到的一些.NET中的正則擴展應用。

3.1     動態生成正則時的轉義——Escape()

有時需要根據一些變量動態生成正則表達式,這時如果變量中含有正則中的元字符,會被解析成元字符,就可能會導致正則編譯不通過,從而導致程序異常,需要對變量進行轉義處理。Regex. Escape()方法通過替換為轉義碼來轉義最小的字符集(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。

比如根據用戶輸入的id取相應的div標簽,id中沒有元字符時,可以取得正確結果。

  1. string test = "<div id=\"test1\">abc</div><div id=\"test2\">def</div>";             
  2. string[] ids = new string[] { "test1""test2" };  
  3. foreach (string id in ids)  
  4. {  
  5. Regex reg = new Regex(@"(?is)<div\s+id=""" + id + @"""[^>]*>(?:(?!</?div\b).)*</div>");  
  6.      MatchCollection mc = reg.Matches(test);  
  7.      foreach (Match m in mc)  
  8.      {  
  9.           richTextBox2.Text += m.Value + "\n";  
  10.      }  
  11. }  
  12. /*--------輸出--------  
  13. <div id="test1">abc</div>  
  14. <div id="test2">def</div>  
  15. */ 

但是如果輸入的id中一旦出現未經轉義的元字符,如“abc(”,就會拋類似于下面的異常。

正在分析“(?is)<div\s+id="abc("[^>]*>(?:(?!</?div\b).)*</div>”- ) 不足。

此時可以用Escape()方法對輸入的變量進行轉義處理。

  1. string test = "<div id=\"test1\">abc</div><div id=\"test2\">def</div>";             
  2. string[] ids = new string[] { "test1""test2""abc(" };  
  3. foreach (string id in ids)  
  4. {  
  5.      Regex reg = new Regex(@"(?is)<div\s+id=""" + Regex.Escape(id) + @"""[^>]*>(?:(?!</?div\b).)*</div>");  
  6.      MatchCollection mc = reg.Matches(test);  
  7.      foreach (Match m in mc)  
  8.      {  
  9.           richTextBox2.Text += m.Value + "\n";  
  10.      }  
  11. }  
  12. /*--------輸出--------  
  13. <div id="test1">abc</div>  
  14. <div id="test2">def</div>  
  15. */ 

使用Escape()方法轉義后,就可以得到正確的結果,而不會拋異常了。

3.2     靜態方法

.NET中一些Regex類的常見方法都提供了相應的靜態方法,可以不顯式的聲明Regex對象,而直接調用相應的方法,書寫起來更方便,代碼更簡潔、易讀。

比如替換IP地址最后一節為“*”,只需一行代碼。

string result = Regex.Replace("10.27.123.12", @"\d+$", "*");   //10.27.123.*

靜態方法每次調用都會創建一個臨時的Regex對象,使用之后釋放,所以每次調用靜態方法時,都會重新編譯,而這將會降低執行效率。因此在循環或是頻繁調用的方法中,不適合使用靜態方法,而需要進行顯式聲明Regex對象。

但是對于一些只調用一次,或是對執行效率沒有要求的場景下,靜態方法則是很不錯的選擇。

本文來自CSDN博客:http://blog.csdn.net/lxcnn/archive/2009/10/12/4656599.aspx

【編輯推薦】

  1. 什么是正則表達式:其歷史與.NET框架的關系
  2. 詳解C#正則表達式
  3. 利用正則表達式使C#判斷輸入日期格式是否正確
  4. .NET下正則表達式應用四例
  5. JAVA正則表達式4種常用的功能

 

責任編輯:彭凡 來源: CSDN
相關推薦

2009-07-31 09:32:04

ASP.NET緩存概念ASP.NET緩存應用

2010-01-12 16:20:44

VB.NET類

2012-01-12 10:21:57

正則表達式

2024-04-24 08:32:55

.NET對象映射

2009-12-22 11:24:37

ADO.NET數據庫

2009-03-24 08:56:15

正則表達式格式清理字符串

2010-01-07 15:25:11

VB.NET數組

2010-06-13 16:53:15

UML類

2021-07-05 10:00:31

JavaStack基礎

2021-08-05 09:55:54

云計算

2010-01-05 15:43:13

.NET Framew

2009-12-15 14:46:04

Ruby類常量

2010-06-18 13:15:07

UML狀態機圖

2010-01-07 13:29:00

VB.NET正則表達式

2010-01-13 17:16:37

VB.NET冒號

2010-01-06 10:18:02

JSON類

2010-01-14 18:08:08

VB.NET抽象類

2009-03-11 10:44:49

.netvb.netArray

2009-10-10 16:40:37

VB.NET Cont

2009-12-30 16:26:12

ADO.NET連接池
點贊
收藏

51CTO技術棧公眾號

国产精品人人做人人爽| 精品欧美久久久| 欧洲精品久久| 国产精品久久久久久免费 | av毛片在线免费看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美色涩在线第一页| 久久青青草综合| 在线观看国产黄| 国产一区观看| 中文字幕精品网| 亚洲婷婷在线观看| 另类一区二区三区| 亚洲激情校园春色| 日韩动漫在线观看| 亚洲国产中文字幕在线| 日日夜夜精品免费视频| 欧美日韩成人在线视频| a级在线免费观看| 91蜜桃臀久久一区二区| 欧美日韩日日骚| 2022亚洲天堂| 91在线中文| 国产精品护士白丝一区av| 国产精品久久久久av福利动漫| 免费黄色片视频| 一区二区三区国产在线| 久久99久久亚洲国产| 丁香激情五月少妇| 日韩成人一级| 精品精品国产高清a毛片牛牛| 制服丝袜综合网| 美女福利一区二区| 亚洲成人av电影在线| 少妇熟女一区二区| 国产高清美女一级毛片久久| va亚洲va日韩不卡在线观看| 亚洲自拍小视频免费观看| 最近中文字幕在线免费观看| 久久精品一本| 97超碰国产精品女人人人爽| 久久午夜无码鲁丝片午夜精品| 先锋资源久久| 日韩视频在线观看免费| 国产午夜福利一区| 真实原创一区二区影院| 亚洲高清久久网| 日本美女视频网站| 亚洲国产视频二区| 日韩一区二区视频在线观看| 九一精品久久久| 9999在线精品视频| 欧美日韩三级视频| 一个色综合久久| 国内精品伊人| 911精品国产一区二区在线| 亚洲不卡视频在线| 久久天堂av| 欧美午夜精品一区| 免费看涩涩视频| 祥仔av免费一区二区三区四区| 欧美欧美午夜aⅴ在线观看| 亚洲精品怡红院| 精品视频一区二区三区四区五区| 在线观看精品一区| 亚洲视频第二页| www.欧美视频| 精品盗摄一区二区三区| 日本精品一二三区| 天天躁日日躁狠狠躁欧美巨大小说| 日韩黄色高清视频| 亚洲欧洲久久久| 97国产精品| 欧美大片免费观看| 日韩成年人视频| 噜噜噜久久亚洲精品国产品小说| 国产成人在线视频| 亚洲综合精品国产一区二区三区| 国产一区欧美二区| 国产精品免费一区二区三区观看| 天天综合网天天综合| 久久午夜羞羞影院免费观看| 亚欧洲精品在线视频免费观看| 暖暖日本在线观看| 亚洲一区二区在线视频| 91传媒久久久| 日本一区二区三区中文字幕| 日韩精品专区在线| 91国模少妇一区二区三区| 久久在线播放| 高清欧美性猛交| 久草热在线观看| 国产不卡视频在线播放| 久中文字幕一区| 麻豆影视在线观看_| 亚洲国产综合色| 无码人妻丰满熟妇区五十路百度| 日本国产一区| 亚洲美女久久久| 9999热视频| 久久婷婷麻豆| 成人午夜电影免费在线观看| 激情小视频在线| 亚洲自拍另类综合| 美女少妇一区二区| 国产一级成人av| 久久精品国产视频| 国产精品免费av一区二区| 免费国产亚洲视频| 国产欧美在线一区二区| 91porn在线观看| 欧美日韩国产精品一区二区三区四区| 国产v亚洲v天堂无码久久久 | 97天天综合网| 日韩欧美在线视频| 日本人妻一区二区三区| 热久久天天拍国产| 国产综合在线看| 国产精品爽爽久久久久久| 久久综合九色综合97婷婷女人| 亚洲精品一卡二卡三卡四卡| 中文在线免费视频| 精品国产污污免费网站入口 | 91综合久久| 日本午夜精品理论片a级appf发布| 亚洲av无码片一区二区三区 | 日韩欧美高清在线观看| 精品一区二区日韩| 欧洲精品在线一区| 国产直播在线| 欧美精品一区二区久久久| 91传媒免费观看| 美女www一区二区| 日韩精品不卡| 国偷自产一区二区免费视频| 亚洲国产精品久久久久秋霞蜜臀| 日韩欧美中文字幕视频| 美女视频网站黄色亚洲| 欧美一区二区三区四区夜夜大片| 国产免费拔擦拔擦8x在线播放 | 污片在线观看一区二区| 中国男女全黄大片| 欧美精品国产一区| 亚洲最大的网站| 成人在线影视| 日韩视频在线你懂得| 男人操女人的视频网站| 国内一区二区视频| eeuss中文| 免费观看在线一区二区三区| 欧美另类极品videosbest最新版本| 国产精品久久久午夜夜伦鲁鲁| 日韩一区欧美小说| 久国产精品视频| 欧美精品播放| 国新精品乱码一区二区三区18| 国产啊啊啊视频在线观看| 日韩视频免费观看高清完整版在线观看 | 欧美调教在线| 91产国在线观看动作片喷水| 天堂成人在线| 欧美亚洲国产一区二区三区va | 亚洲综合色噜噜狠狠| 亚洲AV无码久久精品国产一区| 一区二区三区中文| 91久久精品一区二区别| 黄色小说在线播放| 亚洲精品v天堂中文字幕| 国产成人免费看| 久久精品一区八戒影视| 91极品视频在线观看| 无码一区二区三区视频| 91丝袜美腿美女视频网站| 在线看一级片| 亚洲美女福利视频网站| 久久精品国产亚洲av麻豆蜜芽| 国产精品久久久久影院色老大| 一级黄色片在线免费观看| 欧美三级网页| 国产一级精品aaaaa看| 免费观看一级欧美片| 中文字幕久久久| 国产福利第一页| 精品国产乱码久久久久久婷婷 | japanese国产精品| 成人免费在线视频网址| av成人 com a| 中文字幕日韩有码| 亚洲第一页在线观看| 狠狠干狠狠久久| 国产高潮流白浆| 99久久99久久精品免费观看| 一级在线免费视频| 欧美涩涩网站| 天天综合色天天综合色hd| 免费观看在线一区二区三区| 日韩av免费看网站| 4438x成人网全国最大| 亚洲欧美一区二区精品久久久| 国产原创中文av| 色综合一个色综合亚洲| 蜜臀久久精品久久久用户群体| 久久午夜电影网| 伦伦影院午夜理论片| 日韩影院精彩在线| 久久这里只有精品23| 欧美一站二站| 精品国产一区二区三区免费 | 日韩欧美一级二级| 青青国产在线视频| 亚洲3atv精品一区二区三区| 美女福利视频网| 久久久精品天堂| 亚洲婷婷在线观看| 国产精品主播直播| 国产高潮免费视频| 亚洲在线国产日韩欧美| 永久免费网站视频在线观看| 第九色区aⅴ天堂久久香| 国产一区二区在线观看免费播放| 国产一区二区在线观| 国产精品久久久久久久久久新婚 | 国产精品免费一区| 99re6在线精品视频免费播放| 久青草国产97香蕉在线视频| 阿v免费在线观看| 亚洲美女中文字幕| 少妇高潮久久久| 精品久久久久久久久久久久久久久久久| 国产一区二区在线视频观看| 欧美亚洲综合另类| 九九热最新视频| 色综合久久天天综合网| 国产成人精品网| 红桃av永久久久| 在线观看亚洲欧美| 午夜私人影院久久久久| 国产一级片视频| 亚洲无人区一区| 国产一级在线免费观看| 一区二区三区产品免费精品久久75| 日韩三级在线观看视频| 国产精品久久三区| 国产性猛交xx乱| 中文字幕欧美国产| 久久免费手机视频| 国产精品美女久久久久aⅴ国产馆| www色com| 亚洲欧洲日本在线| 少妇高潮在线观看| 亚洲日本在线a| 好吊色视频在线观看| 一区二区国产盗摄色噜噜| 青青草激情视频| 亚洲国产精品一区二区www在线| 国产精品23p| 午夜精品免费在线| 在线能看的av| 欧洲一区在线观看| 国产又大又黄的视频| 欧美一区二区高清| 老司机午夜福利视频| 亚洲精品国产品国语在线| 手机亚洲第一页| 亚洲天堂免费在线| 日本在线播放| 欧美国产视频一区二区| 国产理论在线| 国产精品欧美一区二区三区奶水| 成人乱码手机视频| 懂色中文一区二区三区在线视频| 美女一区2区| 午夜老司机精品| 正在播放日韩欧美一页 | free性欧美| 日韩av毛片网| 蜜桃在线一区| 欧美18视频| 小说区亚洲自拍另类图片专区| 国产精品视频二| 美女网站久久| 国产欧美精品一二三| 99久久久国产精品免费蜜臀| 亚洲精品天堂网| 亚洲成av人在线观看| 波多野结衣电影在线播放| 678五月天丁香亚洲综合网| 日本wwwxxxx| 色老头一区二区三区在线观看| 色爱综合区网| 国产盗摄xxxx视频xxx69| 国产精品一区二区三区四区在线观看| 国产日韩欧美一区二区三区四区| 欧美午夜精彩| 黄网站欧美内射| 久久99精品国产.久久久久| 亚洲激情 欧美| 国产精品超碰97尤物18| 国产成人亚洲精品自产在线| 欧美日韩精品一区视频| 人妻妺妺窝人体色www聚色窝 | 欧美一级精品大片| 青青视频在线观| 久久在线免费观看视频| 92国产精品| 99中文视频在线| 日韩电影免费在线观看| av高清在线免费观看| 黑人巨大精品欧美一区| asian性开放少妇pics| 亚洲精品免费电影| 少妇无套内谢久久久久| 日韩www在线| 日皮视频在线观看| 国产精品美乳在线观看| 欧美美女啪啪| 黄色三级中文字幕| 久久机这里只有精品| 无码国产69精品久久久久同性| 亚洲一区二区三区在线| 国产精品一区二区av白丝下载 | 91精品国产aⅴ一区二区| 韩国三级av在线免费观看| 久久免费精品视频| 国产成人免费视频网站视频社区 | 成人一区二区在线| 91综合久久| 九九热99视频| 国产精品入口麻豆原神| 香蕉污视频在线观看| 日韩电影免费观看在线观看| 国产色婷婷在线| 国产高清在线一区| 午夜精品网站| 亚洲国产日韩在线一区| 中文字幕精品综合| 天天干天天色综合| 国产视频精品一区二区三区| 麻豆理论在线观看| 国产呦系列欧美呦日韩呦| 亚洲视频久久| 艳妇乳肉豪妇荡乳xxx| 亚洲一区二区精品视频| www.午夜激情| 欧美激情在线观看| 66精品视频在线观看| 欧美极品少妇无套实战| 成人听书哪个软件好| 精品在线视频免费| 亚洲国产古装精品网站| www.51av欧美视频| 久久久久九九九| 久久精品午夜| 婷婷丁香综合网| 欧美精品第一页| 在线观看操人| 国产精品一区在线观看| 亚洲美女色禁图| 波多野结衣办公室33分钟| 日韩欧美国产骚| а√天堂中文在线资源bt在线| 国产精品视频一区二区高潮| 99精品电影| 精品少妇久久久久久888优播| 中文字幕日韩欧美一区二区三区| 在线不卡免费视频| 精品国内自产拍在线观看| 国产精品99久久免费| 成年人深夜视频| 91丨九色丨蝌蚪富婆spa| 波多野结衣视频网址| 中文字幕不卡在线视频极品| 亚洲免费一区| 成人网站免费观看入口| 久久一日本道色综合| 中文字幕一区二区三区四区免费看 | 中文字幕av亚洲精品一部二部| 久久久久亚洲av无码网站| 欧美性极品xxxx做受| 日韩精品毛片| 国产富婆一区二区三区| 亚洲影视在线| 卡通动漫亚洲综合| 日韩电影第一页| 99久久999| 黄色影院一级片| **欧美大码日韩| 国产又爽又黄网站亚洲视频123| 国产精品一区久久久| 国语自产精品视频在线看8查询8| 中国毛片在线观看| 欧美一区二区在线免费播放| 中文字幕在线直播| 欧美做受777cos| 国产午夜精品美女毛片视频| 精品国产区一区二| 国产精品99蜜臀久久不卡二区| 国产精品hd| 欧美xxxooo| 亚洲人成五月天|