正則表達式是由普通字符(如英文字母)以及特殊字符(也稱為元字符)組成的一種文字模式
這種文字模式可用於檢查字符串的值是否滿足一定的規則,例如:
-
驗證輸入的郵箱是否合法
-
輸入的身份證號碼是否合法
-
輸入的用戶名是否滿足條件等
也可以進行字符串的替換和提取
所以,正則表達式可以是單個字符,也可以是更復雜的模式
Regex類
C# 正則表達式 Regex 類,包含於 System.Text.RegularExpressions 命名空間下,常用的方法如下:
方法 |
描述 |
public bool IsMatch( string input ) |
指示 Regex 構造函數中指定的正則表達式,是否在指定的輸入字符串中找到匹配項。 |
public bool IsMatch( string input, int startat ) |
指示 Regex 構造函數中指定的正則表達式, 是否在指定的輸入字符串中找到匹配項,從字符串中指定的開始位置開始。 |
public static bool IsMatch( string input, string pattern ) |
指示指定的正則表達式,是否在指定的輸入字符串中找到匹配項。 |
public MatchCollection Matches( string input ) |
在指定的輸入字符串中,搜索正則表達式的所有匹配項。 |
public string Replace( string input, string replacement ) |
在指定的輸入字符串中, 把所有匹配正則表達式模式的所有匹配的字符串,替換為指定的替換字符串。 |
public string[] Split( string input ) |
把輸入字符串分割為子字符串數組, 根據在 Regex 構造函數中,指定的正則表達式模式定義的位置進行分割。 |
Regex 類中還提供了很多方法來操作正則表達式:
字符 | 描述 |
---|---|
\ | 轉義字符,將一個具有特殊功能的字符轉義為一個普通字符,或反過來 |
(pattern) | 匹配 pattern 並獲取這一匹配 |
(?:pattern) | 匹配 pattern 但不獲取匹配結果 |
(?=pattern) | 正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串 |
(?!pattern) | 負向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串 |
x|y | 匹配x或y;例如: ‘z|food’能匹配“z”或“food”。 ‘(z|f)ood’則匹配“zood”或“food” |
[xyz] | 字符集合;匹配所包含的任意一個字符。例如: ‘[abc]’可以匹配“plain”中的‘a’ |
[^xyz] | 負值字符集合;匹配未包含的任意字符。例如: ‘[^abc]’可以匹配“plain”中的‘p’ |
[a-z] | 匹配指定范圍內的任意字符。例如: ‘[a-z]’可以匹配'a'到'z'范圍內的任意小寫字母字符 |
[^a-z] | 匹配不在指定范圍內的任意字符。例如: ‘[^a-z]’可以匹配不在‘a’~‘z’'內的任意字符 |
\B | 匹配非單詞邊界 |
\D | 匹配一個非數字字符,等價於 [^0-9] |
\f | 匹配一個換頁符 |
\n | 匹配一個換行符 |
\r | 匹配一個回車符 |
\S | 匹配任何非空白字符 |
\t | 匹配一個制表符 |
\v | 匹配一個垂直制表符,等價於 \x0b 和 \cK |
\W | 匹配任何非單詞字符,等價於‘[^A-Za-z0-9_]’ |
正則表達式的符號
正則表達式中的元字符:
字符 | 描述 |
---|---|
. | 匹配除換行符以外的所有字符 |
\w | 匹配字母、數字、下畫線 |
\s | 匹配空白符(空格) |
\d | 匹配數字 |
\b | 匹配表達式的開始或結束 |
^ | 匹配表達式的開始 |
$ | 匹配表達式的結束 |
正則表達式中表示重復的字符:
字 符 | 描 述 |
---|---|
* | 0次或多次字符 |
? | 0次或1次字符 |
+ | 1次或多次字符 |
{n} | n次字符 |
{n,M} | n到M次字符 |
{n, } | n次以上字符 |
Regex類的實例
字符串替換:
1 string strInfo = "YEAR=2021年;MONTH=10月;DAY=01日"; 2 Console.WriteLine("日期:"+strInfo); 3 Console.WriteLine("將日期中的MONTH修改為1月:"); 4 Regex reg = new Regex("MONTH=(.+);"); 5 string strAfter = reg.Replace(strInfo, "MONTH=01月;"); 6 Console.WriteLine("修改后的日期為:\n" + strAfter);
字符串匹配:
1 string strInfo = "YEAR=2021年;MONTH=10月;DAY=01日"; 2 Console.WriteLine("日期:" + strInfo); 3 Console.WriteLine("提取日期字符串中的月份:"); 4 Regex reg = new Regex("MONTH=(.+);"); 5 Match match = reg.Match(strInfo); 6 string strAfter = match.Groups[1].Value; 7 Console.WriteLine("日期的月份為:" + strAfter);
Match實例:
1 string strInfo = "Road=9527;Speed=56.7km/h;Acceleration=5.25mph/s"; 2 Console.WriteLine("道路情況:" + strInfo); 3 Console.WriteLine("提取道路情況中的速度情況:"); 4 Regex reg = new Regex(@"Speed\s*=\s*([\d\.]+)\s*(mph|km/h|m/s)*"); 5 Match match = reg.Match(strInfo); 6 string strAfter1 = match.Groups[1].Value; 7 string strAfter2 = match.Groups[2].Value; 8 Console.WriteLine("速度值為:{0} 速度單位為:{1}", strAfter1, strAfter2);
解碼GPS的GPRMC字符串:
1 // 獲取字符串中的經度、緯度值 2 Regex reg = new Regex(@"^\$GPRMC,[\d\.]*,[A|V],(-?[0-9]*\.?[0-9]+),([NS]*),(-?[0-9]*\.?[0-9]+),([EW]*),.*");
提取 [ ] 中的值:
1 string strInfo = "abcd[9527]dcba"; 2 Console.WriteLine("字符串:" + strInfo); 3 Console.WriteLine("提取字符串[]中的值:"); 4 string pattern = @"(?is)(?<=\[)(.*)(?=\])"; 5 string strAfter = new Regex(pattern).Match(strInfo).Value; 6 Console.WriteLine("字符串[]中的值為:" + strAfter);
提取 ( ) 中的值:
1 string strInfo = "abcd(9527)dcba"; 2 Console.WriteLine("字符串:" + strInfo); 3 Console.WriteLine("提取字符串()中的值:"); 4 string pattern = @"(?is)(?<=\()(.*)(?=\))"; 5 string strAfter = new Regex(pattern).Match(strInfo).Value; 6 Console.WriteLine("字符串()中的值為:" + strAfter);
提取 { } 中的值:
1 string strInfo = "abcd{9527}dcba"; 2 Console.WriteLine("字符串:" + strInfo); 3 Console.WriteLine("提取字符串{}中的值:"); 4 string pattern = @"(?is)(?<=\{)(.*)(?=\})"; 5 string strAfter = new Regex(pattern).Match(strInfo).Value; 6 Console.WriteLine("字符串{}中的值為:" + strAfter);
常用的正則表達式
校驗數字的表達式:
1 // 驗證數字 2 Regex reg = new Regex(@"^[0-9]*$"); 3 // 驗證n位的數字 4 Regex reg = new Regex(@"^\d{n}$"); 5 // 驗證至少n位的數字 6 Regex reg = new Regex(@"^\d{n,}$"); 7 // 驗證m-n位的數字 8 Regex reg = new Regex(@"^\d{m,n}$"); 9 // 驗證零和非零開頭的數字 10 Regex reg = new Regex(@"^(0|[1-9][0-9]*)$"); 11 // 驗證非零開頭的最多帶兩位小數的數字 12 Regex reg = new Regex(@"^([1-9][0-9]*)+(.[0-9]{1,2})?$"); 13 // 驗證帶1-2位小數的正數或負數 14 Regex reg = new Regex(@"^(\-)?\d+(\.\d{1,2})?$"); 15 // 驗證正數、負數、和小數 16 Regex reg = new Regex(@"^(\-|\+)?\d+(\.\d+)?$"); 17 // 驗證有兩位小數的正實數 18 Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$"); 19 // 驗證有1~3位小數的正實數 20 Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,3})?$"); 21 // 驗證非零的正整數 22 Regex reg = new Regex(@"^[1-9]\d*$"); 23 Regex reg = new Regex(@"^([1-9][0-9]*){1,3}$"); 24 Regex reg = new Regex(@"^\+?[1-9][0-9]*$"); 25 // 驗證非零的負整數 26 Regex reg = new Regex(@"^\-[1-9][0-9]*$"); 27 Regex reg = new Regex(@"^-[1-9]\d*$"); 28 // 驗證非負整數 29 Regex reg = new Regex(@"^\d+$"); 30 Regex reg = new Regex(@"^[1-9]\d*|0$"); 31 // 驗證非正整數 32 Regex reg = new Regex(@"^-[1-9]\d*|0$"); 33 Regex reg = new Regex(@"^((-\d+)|(0+))$"); 34 // 驗證非負浮點數 35 Regex reg = new Regex(@"^\d+(\.\d+)?$"); 36 Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$"); 37 // 驗證非正浮點數 38 Regex reg = new Regex(@"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"); 39 Regex reg = new Regex(@"^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$"); 40 // 驗證正浮點數 41 Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$"); 42 Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"); 43 // 驗證負浮點數 44 Regex reg = new Regex(@"^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$"); 45 Regex reg = new Regex(@"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"); 46 // 驗證浮點數 47 Regex reg = new Regex(@"^(-?\d+)(\.\d+)?$"); 48 Regex reg = new Regex(@"^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$");
校驗字符的表達式:
1 // 驗證漢字 2 Regex reg = new Regex(@"^[\u4e00-\u9fa5]{0,}$"); 3 // 驗證英文和數字 4 Regex reg = new Regex(@"^[A-Za-z0-9]+$"); 5 Regex reg = new Regex(@"^[A-Za-z0-9]{4,40}$"); 6 // 驗證長度為3-20的所有字符 7 Regex reg = new Regex(@"^.{3,20}$"); 8 // 驗證由26個英文字母組成的字符串 9 Regex reg = new Regex(@"^[A-Za-z]+$"); 10 // 驗證由26個大寫英文字母組成的字符串 11 Regex reg = new Regex(@"^[A-Z]+$"); 12 // 驗證由26個小寫英文字母組成的字符串 13 Regex reg = new Regex(@"^[a-z]+$"); 14 // 驗證由數字和26個英文字母組成的字符串 15 Regex reg = new Regex(@"^[A-Za-z0-9]+$"); 16 // 驗證由數字、26個英文字母或者下划線組成的字符串 17 Regex reg = new Regex(@"^\w+$"); 18 Regex reg = new Regex(@"^\w{3,20}$"); 19 // 驗證中文、英文、數字包括下划線 20 Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9_]+$"); 21 // 驗證中文、英文、數字但不包括下划線等符號 22 Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]+$"); 23 Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$"); 24 // 驗證可以輸入含有^%&’,;=?$\”等字符 25 Regex reg = new Regex(@"[^%&’,;=?$\x22]+"); 26 // 驗證禁止輸入含有~的字符 27 Regex reg = new Regex(@"[^~\x22]+");
特殊需求的表達式:
1 // 驗證Email地址 2 Regex reg = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"); 3 // 驗證域名 4 Regex reg = new Regex(@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?"); 5 // 驗證InternetURL 6 Regex reg = new Regex(@"[a-zA-z]+://[^\s]*"); 7 Regex reg = new Regex(@"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"); 8 // 驗證手機號碼 9 Regex reg = new Regex(@"^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$"); 10 // 驗證電話號碼(XXX-XXXXXXX、XXXX-XXXXXXXX、XXX-XXXXXXX、XXX-XXXXXXXX、XXXXXXX 和 XXXXXXXX) 11 Regex reg = new Regex(@"^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$"); 12 // 驗證國內電話號碼 13 Regex reg = new Regex(@"\d{3}-\d{8}|\d{4}-\d{7}"); 14 // 驗證身份證號(15位、18位數字) 15 Regex reg = new Regex(@"^\d{15}|\d{18}$"); 16 // 驗證短身份證號碼(數字、字母x結尾) 17 Regex reg = new Regex(@"^([0-9]){7,18}(x|X)?$"); 18 Regex reg = new Regex(@"^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$"); 19 // 驗證帳號是否合法(字母開頭,允許5-16字節,允許字母數字下划線) 20 Regex reg = new Regex(@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$"); 21 // 驗證密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下划線) 22 Regex reg = new Regex(@"^[a-zA-Z]\w{5,17}$"); 23 // 驗證強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間) 24 Regex reg = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$"); 25 // 驗證日期格式 26 Regex reg = new Regex(@"^\d{4}-\d{1,2}-\d{1,2}"); 27 // 驗證一年的12個月 28 Regex reg = new Regex(@"^(0?[1-9]|1[0-2])$"); 29 // 驗證一個月的31天 30 Regex reg = new Regex(@"^((0?[1-9])|((1|2)[0-9])|30|31)$"); 31 // 驗證錢的輸入格式:"10000.00" 和 "10,000.00", 和沒有 “分” 的 "10000" 和 "10,000" 32 Regex reg = new Regex(@"^[1-9][0-9]*$"); 33 // 驗證任意一個不以0開頭的數字 34 Regex reg = new Regex(@"^(0|[1-9][0-9]*)$"); 35 // 驗證一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號 36 Regex reg = new Regex(@"^(0|-?[1-9][0-9]*)$"); 37 // 驗證一個0或者一個可能為負的開頭不為0的數字 38 Regex reg = new Regex(@"^[0-9]+(.[0-9]+)?$"); 39 // 驗證小數點后面至少應該有1位數 40 Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$"); 41 // 驗證小數點后面必須有兩位 42 Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,2})?$"); 43 // 驗證允許用戶只寫一位小數 44 Regex reg = new Regex(@"^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$"); 45 // 驗證1到3個數字,后面跟着任意個 逗號+3個數字,逗號成為可選,而不是必須 46 Regex reg = new Regex(@"^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$"); 47 // 驗證xml文件 48 Regex reg = new Regex(@"^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$"); 49 // 驗證中文字符的正則表達式 50 Regex reg = new Regex(@"[\u4e00-\u9fa5]"); 51 // 驗證雙字節字符 52 Regex reg = new Regex(@"[^\x00-\xff] (包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))"); 53 // 驗證空白行的正則表達式,可用來刪除空白行 54 Regex reg = new Regex(@"\n\s*\r"); 55 // 驗證HTML標記的正則表達式 56 Regex reg = new Regex(@"<(\S*?)[^>]*>.*?</\1>|<.*? />"); 57 // 驗證首尾空白字符的正則表達式 58 Regex reg = new Regex(@"^\s*|\s*$或(^\s*)|(\s*$)"); 59 // 驗證騰訊QQ號(騰訊QQ號從10000開始) 60 Regex reg = new Regex(@"[1-9][0-9]{4,}"); 61 // 驗證中國郵政編碼(中國郵政編碼為6位數字) 62 Regex reg = new Regex(@"[1-9]\d{5}(?!\d)"); 63 // 驗證IP地址 64 Regex reg = new Regex(@"\d+\.\d+\.\d+\.\d+"); 65 // 驗證IP地址 66 Regex reg = new Regex(@"((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))");
*** | 以上內容僅為學習參考、學習筆記使用 | ***