C#經常使用正則表達式回顧

項目中有些時候須要用到正則表達式,可是本身對正則表達式不熟悉,每次學習完,過一段時間(長時間)不用,就又忘了,每次須要用到的時候都須要百度下,比較麻煩,這裏把C#中常常用到的正則表達式作下總結。html

正則表達式經常使用的環境

爬蟲、網站數據驗證、日誌分析、字符串替換、獲取子字符串、文本處理、字符串處理等正則表達式

正則基礎

1. []方括號表示匹配能夠匹配方括號中的任意點單個字符,方括號只容許匹配單個字符。
2. | 或表示兩項之間的一個選擇,它不能和方括號使用,只能和小括號使用。
3. ()小括號表示一個子表達式的開始和結束位置
4. ^ 否符號,若是用在方括號內,「^」表示不想要匹配的字符。
5. . 點字符:匹配除換行符 \n 以外的任何單字符。要匹配 . ,請使用 \. 。
6. 定位符:定位符使您可以將正則表達式固定到行首或行尾,^ 和 $ 分別指字符串的開始與結束
7. 限定符:限定符用來指定正則表達式的一個給定組件必需要出現多少次才能知足匹配緩存

  • * 表示匹配前面的子表達式0次或屢次
  • ?表示匹配前面的子表達式0次或一次
  • + 表示匹配前面的子表達式至少匹配一次
  • {n} 表示匹配前面的子表達式n次
  • {n,m} 表示匹配前面的子表達式從n次到m次

8. 轉義字符學習

  • \d 匹配一個數字字符。等價於 [0-9]。
  • \D 匹配一個非數字字符。等價於 [^0-9]。
  • \s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
  • \S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
  • \w 匹配字母、數字、下劃線。等價於'[A-Za-z0-9_]'。
  • \W 匹配非字母、數字、下劃線。等價於 '[^A-Za-z0-9_]'。
  • \n 匹配一個換行符
  • \r 匹配一個回車符
  • \b 匹配一個單詞邊界,即字與空格間的位置。匹配單詞的開始或者結尾部分
  • \B 匹配非單詞邊界 匹配單詞的中間部分,例如:匹配:Chapter中的apt,/\Bapt/

9. 捕獲組:除(Expression)和(?<name>Expression)語法外,其它的(?...)語法都不是捕獲組。網站

    var str = "Is is the cost of of gasoline going up up";
    var patt1 = @"\b([a-z]+) \1\b";
    var matchDatas1 = Regex.Matches(str, patt1).Select(x => x.Value);
    Console.WriteLine(JsonConvert.SerializeObject(matchDatas1));//["of of","up up"]

捕獲組的順序是從左到右,從1開始,0表明總體,這裏的\1就是分組的第一個自匹配項,在Replace中能夠用$1操做編碼

    string a = @"(020)76544567";
    string b = @"\((\d{3})\)(\d{8})";
    var c = new Regex(b);
    string d = c.Replace(a, "$0-$1-$2");
    Console.WriteLine(d);//(020)76544567-020-76544567    

10.選擇
用圓括號將全部選擇項括起來,相鄰的選擇項之間用|分割。用圓括號會有一個反作用,使相關的匹配會被緩存,緩存的數據會佔用內存,下降匹配效率。此時可用?:放在第一個選項前來消除這種反作用。
可使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。url

  • (?:pattern)匹配pattern,但不捕獲匹配結果。'industr(?:y|ies)' 例如:匹配'industry'或'industries'。
  • (?=pattern)零寬度正向預查,不捕獲匹配結果。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」
  • (?!pattern)正向否認預查,不捕獲匹配結果。例如,「Windows(?!95|98|NT|2000)」不能匹配「Windows2000」中的「Windows」,但能匹配「Windows3.1」中的「Windows」

經常使用正則表達式

1. 非空字符串,適用於匹配單詞,關鍵字等 @"\S+"spa

2. html標籤 @"<[^>]+>"日誌

  • 匹配帶鏈接的a標籤 @"<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"
  • 匹配連接 "(href|src)\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
  • 匹配圖片 "<img(.*?)>"

3. Email地址:@"\w+@(\w+\.)+\w{2,3}";code

4. 域名:@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?";

5. InternetURL:@"[a-zA-z]+://[^\s]*" 或 @"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$";

6. 手機號碼:@"^([1][3,4,5,6,7,8,9])\d{9}$";

7. 國內電話號碼:@"\d{3}-\d{8}|\d{4}-\d{7}";

8. 身份證:@"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)";

9. 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在 6-10 之間):@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,10}$";

10. 簡單密碼:@"\w{6,10}";

11. 賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$";

12. 錢:@"^[0-9]+(.[0-9]+)?$";

13. QQ:@"[1-9][0-9]{4,}";

13. 郵政編碼:@"[1-9]\d{5}(?!\d)";

14. IP:@"^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$";

15. 數字: @"^\d+$";

16. 字母:@"^[a-zA-Z]+$";

相關文章
相關標籤/搜索