1. 程式人生 > >C#每日一課(二十三)

C#每日一課(二十三)

C#正則表示式 正則表示式就是使用一系列特殊字元模式,來表示某一類字串。 .NET中提供了Regex類實現了驗證正則表示式的方法。Regex類中包含靜態方法,則可以在不對類進行例項化的情況下使用正則表示式中方法。

  • 正則表示式相關模式說明
模式 說明
\ 轉義字元,把一個具有特殊功能的字元轉義為一個普通字元,或者是使用\加上普通字元表示特殊功能
^ 匹配輸入字串的開始位置
$ 匹配輸入字串的結束位置
* 匹配前面的0次或多次子表示式
+ 匹配前面的一次或多次的子表示式(這裡與*的區別在於至少匹配一次)
? 匹配前面0次或一次子表示式(這裡與*的區別在於它最多匹配一次)
{n} n是一個非負整數,匹配前面的n次子表示式
{n,} n是一個非負整數,至少匹配前面的n次子表示式
{n,m} m和n都是非負整數,其中n<=m,最少匹配n次且最多匹配m次
? 當這個字元跟其它的限制字元(*,+,?,{n},{n,},{n,m})後面的話匹配模式會盡可能少地匹配所搜尋的字串
. 匹配除了\n外的任意單個字元
(pattern) 匹配pattern並獲取這一匹配
(?:pattern) 匹配pattern但並不獲取匹配結果
(?=pattern) 正向預查,在任何匹配pattern的字串開始處匹配查詢字串
(?!pattern) 反向預查,在任何不匹配pattern的字串開始處匹配查詢字串
x y
[xyz] 字元集合,匹配所包含的任意字元
[^xyz] 這個與[xyz]相反,匹配未包含的任意字元
[a-z] 匹配指定範圍的任意字元
[^a-z] 與[a-z]相反,匹配不在指定範圍的任意字元
\b 匹配單詞的邊界,指單詞和空格間的位置
\B 匹配非單詞的邊界
\d 等價於[0-9],匹配一個數字字元
\D 等價於[^0-9],匹配一個非數字字元
\f 匹配一個換頁符
\n 匹配一個換行符
\r 匹配一個回車符
\s 匹配任何空白字元,包括空格、製表符、換頁符等
\S 匹配任何非空白字元
\t 匹配一個製表符
\v 匹配一個垂直製表符
\w 匹配包括下劃線的任何單詞字元,等價於[A-Za-z0-9]
\W 與\w相反,匹配任何非單詞字元,等價於[^A-Za-z0-9_]
  • C#中正則表示式常用類Regex類 常用方法 1.靜態Match方法 使用Match方法可以得到源中第一個匹配模式的連續子串 靜態的Match方法有兩個過載,分別是:
//引數是:輸入、模式
Regex.Match(string input, string pattern);
//引數是:輸入、模式、RegexOptions列舉的按位或組合
Regex.Match(string input, string pattern, RegexOptions options);

關於RegexOptins列舉的有效值如下: Complied:編譯此模式 CultureInvariant:不考慮文化背景 ECMAScript:符合ECMAScript,這個值只能與IgnoreCase、Multiline、Complied連用 ExplicitCapture:儲存顯示命名的組 IgnoreCase:不區分輸入的大小寫 IngorePatternWhitespace:去掉模式中的非轉義空白,並啟用由#標記的註釋 Multiline:多行模式,改變元字元^和$的含義,它們可以匹配行的開頭和結尾 None:無設定 RightToLeft:表示從右向左掃描、匹配,這個時候Match方法返回從右向左的第一個匹配 Singleline:單行模式,改變元字元.的含義,它可以匹配換行符

注意:Multiline在沒有ECMAScript的情況下可以和Singleline連用Multiline和Singleline不互斥,但是與ECMAScript互斥

2.靜態Matches方法 這個方法的過載形式與靜態Match相同,返回一個MatchCollection,表示輸入中匹配模式的匹配集合。

3.靜態IsMatch方法 這個方法返回bool值,過載形式與靜態Matchs相同,如果輸入中匹配模式,返回true,否則返回false. IsMatch方法可以理解為,返回Matches方法返回的集合是否為空。

Regex類非靜態方法 1.字串替換 Replace方法 注意:如果要使用Regex類則需要引用using System.Text.RegularExpressions; 使用Visual Studio 新增C#控制檯應用程式chapter18_001 原生成的原始檔開頭處加上如下程式碼:

using System.Text.RegularExpressions;

在Main方法中加上如下程式碼進行測試

//源字串
string str = "id=123;name=xiesheng;[email protected]";
//模式
string pattern = "name=(.+);";
//把模式匹配到的字串替換後的字串
string re_str = "name=xiaoxie;";
Regex reg = new Regex(pattern);
Console.WriteLine("-----------------字串替換Replace方法--------------------");
Console.WriteLine("源字串:{0}", str);
Console.WriteLine("模式:{0}",pattern);

if (Regex.IsMatch(str, pattern))
{
        //當使用模式匹配到結果時執行語句
        string match = Regex.Match(str, pattern).ToString();
        Console.WriteLine("根據模式匹配到的字串:{0}", match);
        Console.WriteLine("把匹配到的字串替換為:{0}", re_str);
        string de_str = reg.Replace(str, re_str);
        Console.WriteLine("替換完成後的字串為:{0}", de_str);
}
else
        //當使用模式未匹配到結果時執行語句
       Console.WriteLine("源字串根據模式未匹配到字串");
Console.ReadKey();

編譯執行結果如下: 編譯執行結果

2.匹配字串 Match方法 前面說過Match靜態方法中是提供了引數傳入源字串及匹配模式,如果使用例項化的物件呼叫Match方法則直接傳入引數源字串及可(在例項化Regex的時候已經使用模式進行過了初始化,即已經確定了匹配的模式) 比如上面的程式碼中可以把string match = Regex.Match(str, pattern).ToString();替換為string match = reg.Match(str).ToString(); 編譯執行的結果是一致的。

如查需要顯示模式中匹配到的值可以把Main方法改造為如下:

using System.Text.RegularExpressions;

在Main方法中加上如下程式碼進行測試

//源字串
string str = "id=123;name=xiesheng;[email protected]";
//模式
string pattern = "name=(.+);";
//把模式匹配到的字串替換後的字串
string re_str = "name=xiaoxie;";
Regex reg = new Regex(pattern);
Console.WriteLine("-----------------字串替換Replace方法--------------------");
Console.WriteLine("源字串:{0}", str);
Console.WriteLine("模式:{0}",pattern);

if (Regex.IsMatch(str, pattern))
{
        //當使用模式匹配到結果時執行語句
        string match = Regex.Match(str, pattern).ToString();
        Console.WriteLine("根據模式匹配到的字串:{0}", match);
        Console.WriteLine("把匹配到的字串替換為:{0}", re_str);
        string de_str = reg.Replace(str, re_str);
        Console.WriteLine("替換完成後的字串為:{0}", de_str);
		
		Console.WriteLine("-----------------提取匹配到的字串的值--------------------");
        string value = reg.Match(str).Groups[1].Value;
        Console.WriteLine("匹配到的結果:{0}",value);
}
else
        //當使用模式未匹配到結果時執行語句
       Console.WriteLine("源字串根據模式未匹配到字串");
Console.ReadKey();

編譯執行的結果如下: 編譯執行結果

  • C#常用正則表示式
  • 校驗數字表達式
//數字
Regex reg = new Regex(@"^[0-9]*$");
//n位數字
Regex reg = new Regex(@"^\d{n}$");
//至少n位數字
Regex reg = new Regex(@"^\d{n,}$");
//m~n位的數字
Regex reg = new Regex(@"^\d{m,n}$");
//0和非0開頭的數字
Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
//非0開頭的最多帶兩位小數的數字
Regex reg = new Regex(@"^([1-9][0-9]*)+(.[0-9]{1,2})?$");
//帶1~2位小數的正數或負數
Regex reg = new Regex(@"^(\-)?\d+(\.\d{1,2})?$");
//正數、負數、小數
Regex reg = new Regex(@"^(\-|\+)?\d+(\.\d+)?$");
//有兩位小數的正實數
Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
//有1~3位小數的正實數
Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,3})?$");
//非零的正整數
Regex reg = new Regex(@"^[1-9]\d*$");
Regex reg = new Regex(@"^([1-9][0-9]*){1,3}$"); 
Regex reg = new Regex(@"^\+?[1-9][0-9]*$");
//非零的負整數
Regex reg = new Regex(@"^\-[1-9][0-9]*$");
Regex reg = new Regex(@"^-[1-9]\d*$");
//非負整數
Regex reg = new Regex(@"^\d+$"); 
Regex reg = new Regex(@"^[1-9]\d*|0$");
//非正整數
Regex reg = new Regex(@"^-[1-9]\d*|0$");
Regex reg = new Regex(@"^((-\d+)|(0+))$");
//非負浮點數
Regex reg = new Regex(@"^\d+(\.\d+)?$"); 
Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$");
//非正浮點數
Regex reg = new Regex(@"^((-\d+(\.\d+)?)|(0+(\.0+)?))$");
Regex reg = new Regex(@"^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$");
//正浮點數
Regex reg = new Regex(@"^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$"); 
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]*))$");
//負浮點數
Regex reg = new Regex(@"^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$"); 
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]*)))$");
//浮點數
Regex reg = new Regex(@"^(-?\d+)(\.\d+)?$"); 
Regex reg = new Regex(@"^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$");
  • 校驗字元表示式
//漢字
Regex reg = new Regex(@"^[\u4e00-\u9fa5]{0,}$");
//英文和數字
Regex reg = new Regex(@"^[A-Za-z0-9]+$");
Regex reg = new Regex(@"^[A-Za-z0-9]{4,40}$");
//長度為3~20的所有字元
Regex reg = new Regex(@"^.{3,20}$");
//由26個英文字母組成的字串
Regex reg = new Regex(@"^[A-Za-z]+$");
//由26個大寫英文字母組成的字串
Regex reg = new Regex(@"^[A-Z]+$");
//由26個小寫英文字母組成的字串
Regex reg = new Regex(@"^[a-z]+$");
//由數字和26個英文字母組成的字串
Regex reg = new Regex(@"^[A-Za-z0-9]+$");
//由數字、26個英文字母或者下劃線組成的字串
Regex reg = new Regex(@"^\w+$"); 
Regex reg = new Regex(@"^\w{3,20}$");
//中文、英文、數字包括下劃線
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9_]+$");
//中文、英文、數字但不包括下劃線等符號
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]+$"); 
Regex reg = new Regex(@"^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$");
//可以輸入含有^%&’,;=?$\”等字元
Regex reg = new Regex(@"[^%&’,;=?$\x22]+");
//禁止輸入含有~的字元
Regex reg = new Regex(@"[^~\x22]+");
  • 特殊需求正則表示式
//Email地址
Regex reg = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
//域名
Regex reg = new Regex(@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
//InternetURL
Regex reg = new Regex(@"[a-zA-z]+://[^\s]*");
Regex reg = new Regex(@"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");
//手機號碼
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}$");
//國內電話號碼(0511-4405222、021-87888822)
Regex reg = new Regex(@"\d{3}-\d{8}|\d{4}-\d{7}");
//身份證號(15位、18位數字)
Regex reg = new Regex(@"^\d{15}|\d{18}$");
//密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線)
Regex reg = new Regex(@"^[a-zA-Z]\w{5,17}$");
//強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間)
Regex reg = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$");
//IP地址
Regex reg = new Regex(@"\d+\.\d+\.\d+\.\d+");// (提取IP地址時有用)
//IP地址
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))");