項目中有些時候須要用到正則表達式,可是本身對正則表達式不熟悉,每次學習完,過一段時間(長時間)不用,就又忘了,每次須要用到的時候都須要百度下,比較麻煩,這裏把C#中常常用到的正則表達式作下總結。html
爬蟲、網站數據驗證、日誌分析、字符串替換、獲取子字符串、文本處理、字符串處理等正則表達式
1. []方括號表示匹配能夠匹配方括號中的任意點單個字符,方括號只容許匹配單個字符。
2. | 或表示兩項之間的一個選擇,它不能和方括號使用,只能和小括號使用。
3. ()小括號表示一個子表達式的開始和結束位置
4. ^ 否符號,若是用在方括號內,「^」表示不想要匹配的字符。
5. . 點字符:匹配除換行符 \n 以外的任何單字符。要匹配 . ,請使用 \. 。
6. 定位符:定位符使您可以將正則表達式固定到行首或行尾,^ 和 $ 分別指字符串的開始與結束
7. 限定符:限定符用來指定正則表達式的一個給定組件必需要出現多少次才能知足匹配緩存
8. 轉義字符學習
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
1. 非空字符串,適用於匹配單詞,關鍵字等 @"\S+"spa
2. html標籤 @"<[^>]+>"日誌
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]+$";