什么是正則表達式?
英文Regular
Expression,是計算機科學(xué)的一個重要概念,她使用一種數(shù)學(xué)算法來解決計算機程序中的文本檢索铛楣,匹配等問題定枷,正則表達式語言是一種專門用于字符串處理的語言。在很多語言中都提供了對它的支持涵妥,c#也不例外个初,它可以幫我們解決下面的問題:
1乖寒,檢索:通過正則表達式,從字符串中獲取我們想要的部分
?2院溺,匹配:判斷給定的字符串是否符合正則表達式的過濾邏輯
你可以認為正則表達式表述了一個字符串的書寫規(guī)則
判斷用戶輸入的密碼是否合法楣嘁,判斷用戶輸入的郵箱格式是否合法
正則表達式的組成
正則表達式就是由普通字符以及特殊字符(成為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串珍逸。
常用的操作正則表達式的方法和委托
下面學(xué)習(xí)一下位于System.Text.RegularExpressions下的Regex類的一些靜態(tài)方法和委托
1,靜態(tài)方法IsMatch
(返回值是一個布爾類型,用于判斷指定的字符串是否與正則表達式字符串匹配马澈,它有三個重載方法)
? bool
IsMatch(string input, string pattern);
? 參數(shù):?
?input:?????? 要搜索匹配項的字符串。
? pattern:???? 要匹配的正則表達式模式弄息。
? 返回結(jié)果:? 如果正則表達式找到匹配項痊班,則為 true;否則摹量,為 false涤伐。
? boolIsMatch(string input, string pattern, RegexOptions options);
? 參數(shù):?
?input:?????? 要搜索匹配項的字符串。
? pattern:???? 要匹配的正則表達式模式。
? options:???? 枚舉值的一個按位組合,這些枚舉值提供匹配選項窗看。
? 返回結(jié)果:? 如果正則表達式找到匹配項什燕,則為 true混巧;否則,為 false。
? boolIsMatch(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);
? 參數(shù):?
?input:??????? 要搜索匹配項的字符串挤茄。
? pattern:????? 要匹配的正則表達式模式山害。
? options:????? 枚舉值的一個按位組合纠俭,這些枚舉值提供匹配選項。
? matchTimeout:超時間隔浪慌,或 System.Text.RegularExpressions.Regex.InfiniteMatchTimeout 指示該方法不應(yīng)超時冤荆。
? 返回結(jié)果:? 如果正則表達式找到匹配項,則為 true权纤;否則钓简,為 false。
關(guān)于參數(shù)RegexOptions
它是一個枚舉類型汹想,有以下枚舉值
RegexOptions枚舉值? ? ? ? ?內(nèi)聯(lián)標(biāo)志? ? ? ? ?簡單說明
ExplicitCapture? ? ? ? ? ? ? ? ? ? n? ? ? ? ? ? ? ? ? ? 只有定義了命名或編號的組才捕獲
IgnoreCase? ? ? ? ? ? ? ? ? ? ? ? ? i? ? ? ? ? ? ? ? ? ? ?不區(qū)分大小寫
IgnorePatternWhitespace? ? ?x? ? ? ? ? ? ? ? ? ?消除模式中的非轉(zhuǎn)義空白并啟用由# 標(biāo)記的注釋外邓。
MultiLine? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m? ? ? ? ? ? ? ? ?多行模式,其原理是修改了^和$的含義
SingleLine? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s? ? ? ? ? ? ? ? ? 單行模式古掏,和MultiLine相對應(yīng)
內(nèi)斂標(biāo)志可以更小力度(一組為單位)的定義匹配選項
靜態(tài)方法Match(System.Text.RegularExpressions)靜態(tài)方法Match(System.Text.RegularExpressions)
靜態(tài)方法Match损话,使用指定的匹配選項在輸入字符串中搜索指定的正則表達式的第一個匹配項。
返回一個包含有關(guān)匹配的信息的對象冗茸。同樣有三個重載方法,參數(shù)和IsMatch方法相同匹中。此外夏漱,在Regex類中,還有一個同名的非靜態(tài)方法顶捷,適用于多個實例的情況下挂绰,效率更高一些。
Match Match(string input, string pattern);
Match Match(string input, string pattern, RegexOptions options);
Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
靜態(tài)方法Matches(System.Text.RegularExpressions)
靜態(tài)方法Matches,在指定的輸入字符串中搜索指定的正則表達式的所有匹配項服赎。跟上面方法不同之處葵蒂,就是這個方法返回的是所有匹配項,他同樣有三個重載方法重虑,并且參數(shù)和Match方法完全相同
? MatchCollectionMatches(string input, string pattern);
? MatchCollectionMatches(string input, string pattern, RegexOptions options);
? MatchCollectionMatches(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);
Replaces函數(shù)(System.Text.RegularExpressions)
我們知道正則表達式主要是實現(xiàn)驗證,提取,分割,替換字符的功能.Replace函數(shù)是實現(xiàn)替換功能的.
1 )Replace(string input,stringpattern,string replacement)?
//input是源字符串,pattern是匹配的條件,replacement是替換的內(nèi)容,就是把符合匹配條件pattern的內(nèi)容轉(zhuǎn)換成它
比如string result =Regex.Replace("abc", "ab", "##");?
//結(jié)果是##c,就是把字符串a(chǎn)bc中的ab替換成##
2 )Replace(string input,string pattern,string replacement,RegexOptions options)? ? ??
//RegexOptions是一個枚舉類型,用來做一些設(shè)定.
//前面用注釋時就用到了RegexOptions.IgnorePatternWhitespace.如果在匹配時忽略大小寫就可以用RegexOptions.IgnoreCase
比如string result =Regex.Replace("ABc", "ab", "##",RegexOptions.IgnoreCase);
如果是簡單的替換用上面兩個函數(shù)就可以實現(xiàn)了.但如果有些復(fù)雜的替換,比如匹配到很多內(nèi)容,不同的內(nèi)容要替換成不同的字符.就需要用到下面兩個函數(shù)
3 )Replace(string input,stringpattern,MatchEvaluator evaluator);???
//evaluator是一個代理,其實簡單的說是一個函數(shù)指針,把一個函數(shù)做為參數(shù)參進來
//由于C#里沒有指針就用代理來實現(xiàn)類似的功能.你可以用代理綁定的函數(shù)來指定你要實現(xiàn)的復(fù)雜替換.
4 )Replace(string input,string pattern,MatchEvaluator evaluator,RegexOptions options);
//這個函數(shù)上上面的功能一樣,只不過多了一點枚舉類型來指定是否忽略大小寫等設(shè)置
靜態(tài)方法Split拆分文本
使用正則表達式匹配的位置践付,將文本拆分為一個字符串?dāng)?shù)組,同樣有三個重載方法,返回值為字符串?dāng)?shù)組
string[] Split(string input, string pattern);
string[] Split(string input, string pattern, RegexOptions options);
string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);
@符號
我們經(jīng)常在正則表達式字符串前面加上@字符缺厉,這樣不讓編譯器去解析其中的轉(zhuǎn)義字符永高,而作為正則表達式的語法(元字符)存在。
string s =@"www.baidu.com \n lkjsdflkj";
定位元字符
我們經(jīng)常在正則表達式字符串前面加上@字符提针,這樣不讓編譯器去解析其中的轉(zhuǎn)義字符命爬,而作為正則表達式的語法(元字符)存在。
字符? 說明
\b? 匹配單詞的開始或結(jié)束
\B? 匹配非單詞的開始或結(jié)束
^? 匹配必須出現(xiàn)在字符串的開頭或行的開頭
$? 匹配必須出現(xiàn)在以下位置:字符串結(jié)尾辐脖、字符串結(jié)尾處的\n 之前或行的結(jié)尾饲宛。
\A? 指定匹配必須出現(xiàn)在字符串的開頭(忽略Multiline 選項)。
\z? 指定匹配必須出現(xiàn)在字符串的結(jié)尾(忽略Multiline 選項)嗜价。
\z? 指定匹配必須出現(xiàn)在字符串的結(jié)尾或字符串結(jié)尾處的\n 之前(忽略 Multiline 選項)艇抠。
\G? 指定匹配必須出現(xiàn)在上一個匹配結(jié)束的地方幕庐。與Match.NextMatch() 一起使用時,此斷言確保所有匹配都是連續(xù)的练链。
定位元字符示例
示例一:? 區(qū)配開始^
? stringstr = "I am Blue cat";??????????
? Console.WriteLine(Regex.Replace(str,"^","準備開始:"));
示例二: 區(qū)始結(jié)束 $
? stringstr = "I am Blue cat";??????????
? Console.WriteLine(Regex.Replace(str,"$", "? 結(jié)束了翔脱!"));
基本語法元字符
字符? 說明
.? 匹配除換行符以外的任意字符
\w? 匹配字母、數(shù)字媒鼓、下劃線届吁、漢字? (指大小寫字母、0-9的數(shù)字绿鸣、下劃線_)
\W? \w的補集? ( 除“大小寫字母疚沐、0-9的數(shù)字、下劃線_”之外)
\s? 匹配任意空白符? (包括換行符/n潮模、回車符/r亮蛔、制表符/t、垂直制表符/v擎厢、換頁符/f)
\S? \s的補集? (除\s定義的字符之外)
\d? 匹配數(shù)字? (0-9數(shù)字)
\D? 表示\d的補集? (除0-9數(shù)字之外)
在正則表達式中究流,\是轉(zhuǎn)義字符. * 是元字符 如果要表示一個\ .
*字符的話,需要使用\\ \. \*
示例
示例一:校驗只允許輸入數(shù)字
string strCheckNum1 =
"23423423a3", strCheckNum2 = "324234";
Console.WriteLine("匹配字符串"+strCheckNum1+"是否為數(shù)字:"+Regex.IsMatch(strCheckNum1,@"^\d*$"));
Console.WriteLine("匹配字符串" +strCheckNum2 + "是否為數(shù)字:" + Regex.IsMatch(strCheckNum2,@"^\d*$"));
示例二:校驗只允許輸入除大小寫字母动遭、0-9的數(shù)字芬探、下劃線_以外的任何字
string strCheckStr1 ="abcds_a", strCheckStr2 = "**&&((((2", strCheckStr3= "**&&((((";
string regexStr = @"^\W*$";
Console.WriteLine("匹配字符串" +strCheckStr1 + "是否為除大小寫字母、0-9的數(shù)字厘惦、下劃線_以外的任何字符:" +Regex.IsMatch(strCheckStr1, regexStr));
Console.WriteLine("匹配字符串" +strCheckStr2 + "是否為除大小寫字母偷仿、0-9的數(shù)字、下劃線_以外的任何字符:" +Regex.IsMatch(strCheckStr2, regexStr));
Console.WriteLine("匹配字符串" +strCheckStr3 + "是否為除大小寫字母宵蕉、0-9的數(shù)字酝静、下劃線_以外的任何字符:" +Regex.IsMatch(strCheckStr3, regexStr));
反義字符
字符? 說明
\W? \w的補集? ( 除“大小寫字母、0-9的數(shù)字羡玛、下劃線_”之外)
\S? \s的補集? (除\s定義的字符之外)
\D? 表示\d的補集? (除0-9數(shù)字之外)
\B? 匹配不是單詞開頭或結(jié)束的位置
[ab]? 匹配中括號中的字符
[a-c]? a字符到c字符之間是字符
[^x]? 匹配除了x以外的任意字符
[^adwz]? 匹配除了adwz這幾個字符以外的任意字符
//示例:查找除ahou這之外的所有字符
string strFind1 = "I am aCat!", strFind2 = "My Name's Blue cat!";????????????
Console.WriteLine("除ahou這之外的所有字符别智,原字符為:"+ strFind1 + "替換后:" + Regex.Replace(strFind1,@[^ahou]","*"));
Console.WriteLine("除ahou這之外的所有字符,原字符為:"+ strFind2 + "替換后:" + Regex.Replace(strFind2, @"[^ahou]", "*"));
重復(fù)描述字符
字符? 說明
{n}? 匹配前面的字符n次
{n,}? 匹配前面的字符n次或多于n次
{n,m}? 匹配前面的字符n到m次
?? 重復(fù)零次或一次
+? 重復(fù)一次或更多次
*? 重復(fù)零次或更多次
示例:校驗輸入內(nèi)容是否為合法QQ號(備注:QQ號為5-12位數(shù)字)
string isQq1 = "1233", isQq2 ="a1233", isQq3 = "0123456789123", isQq4 ="556878544";
string regexQq = @"^\d{5,12}$";
Console.WriteLine(isQq1+"是否為合法QQ號(5-12位數(shù)字):"+ Regex.IsMatch(isQq1, regexQq));
Console.WriteLine(isQq2 +"是否為合法QQ號(5-12位數(shù)字):" + Regex.IsMatch(isQq2, regexQq));
Console.WriteLine(isQq3 +"是否為合法QQ號(5-12位數(shù)字):" + Regex.IsMatch(isQq3, regexQq));
Console.WriteLine(isQq4 +"是否為合法QQ號(5-12位數(shù)字):" + Regex.IsMatch(isQq4, regexQq));
擇一匹配
字符? 說明
?|? ? ? ? ?將兩個匹配條件進行邏輯“或”(Or)運算稼稿。
示例一:查找數(shù)字或字母
string findStr1 = "ad(d3)-df";
string regexFindStr =@"[a-z]|\d";
string newStrFind=String.Empty;
MatchCollection newStr =? Regex.Matches(findStr1, regexFindStr);
?newStr.Cast().Select(m =>m.Value).ToList().ForEach(i => newStrFind += i);
Console.WriteLine(findStr1 +"中的字母和數(shù)字組成的新字符串為:" + newStrFind);
示例二:將人名輸出("zhangsan;lisi,wangwu.zhaoliu")
string strSplit ="zhangsan;lisi,wangwu.zhaoliu";
string regexSplitstr =@"[;]|[,]|[.]";
Regex.Split(strSplit,regexSplitstr).ToList().ForEach(i => Console.WriteLine(i));
示例三:校驗國內(nèi)電話號碼
(支持三種寫法校驗 A. 010-87654321 B.(010)87654321 C.01087654321 D.010 87654321)
string TelNumber1 ="(010)87654321", TelNumber2 = "010-87654321", TelNumber3 ="01087654321",
???????TelNumber4 = "09127654321", TelNumber5 ="010)87654321",TelNumber6="(010-87654321",
? ? ? ?TelNumber7="91287654321";
Regex RegexTelNumber3 = new Regex(@"\(0\d{2,3}\)[- ]?\d{7,8}|^0\d{2,3}[- ]?\d{7,8}$");
Console.WriteLine("電話號碼 " +TelNumber1 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber1));
Console.WriteLine("電話號碼 " +TelNumber2 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber2));
Console.WriteLine("電話號碼 " +TelNumber3 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber3));
Console.WriteLine("電話號碼 " +TelNumber4 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber4));
Console.WriteLine("電話號碼 " +TelNumber5 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber5));
Console.WriteLine("電話號碼 " +TelNumber6 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber6));
Console.WriteLine("電話號碼 " +TelNumber7 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber7));