正則表達式

什么是正則表達式?

英文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));

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亿遂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渺杉,更是在濱河造成了極大的恐慌蛇数,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是越,死亡現(xiàn)場離奇詭異耳舅,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門浦徊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馏予,“玉大人,你說我怎么就攤上這事盔性∠忌ィ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵冕香,是天一觀的道長蛹尝。 經(jīng)常有香客問我,道長悉尾,這世上最難降的妖魔是什么突那? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮构眯,結(jié)果婚禮上愕难,老公的妹妹穿的比我還像新娘。我一直安慰自己惫霸,他們只是感情好猫缭,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壹店,像睡著了一般猜丹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茫打,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天居触,我揣著相機與錄音妖混,去河邊找鬼老赤。 笑死,一個胖子當(dāng)著我的面吹牛制市,可吹牛的內(nèi)容都是我干的抬旺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼祥楣,長吁一口氣:“原來是場噩夢啊……” “哼开财!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起误褪,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤责鳍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兽间,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體历葛,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年嘀略,在試婚紗的時候發(fā)現(xiàn)自己被綠了恤溶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓诽。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咒程,靈堂內(nèi)的尸體忽然破棺而出鸠天,到底是詐尸還是另有隱情,我是刑警寧澤帐姻,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布稠集,位于F島的核電站,受9級特大地震影響卖宠,放射性物質(zhì)發(fā)生泄漏巍杈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一扛伍、第九天 我趴在偏房一處隱蔽的房頂上張望筷畦。 院中可真熱鬧,春花似錦刺洒、人聲如沸鳖宾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼎文。三九已至,卻和暖如春因俐,著一層夾襖步出監(jiān)牢的瞬間拇惋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工抹剩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撑帖,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓澳眷,卻偏偏與公主長得像胡嘿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钳踊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 初衷:看了很多視頻衷敌、文章,最后卻通通忘記了拓瞪,別人的知識依舊是別人的缴罗,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,020評論 0 20
  • /* * 索引器: * 作用:讓對象具有快速訪問元素的能力 * 索引器和數(shù)組的區(qū)別: * 1.索引器的索引類型不限...
    Unity開發(fā)閱讀 1,105評論 0 0
  • iOS中使用正則表達式就不得不提NSRegularExpression,所以我們需要先搞清楚什么是NSRegula...
    sunmumu1222閱讀 2,348評論 0 4
  • Java的正則表達式講解:(為了能看清,本文正則表達式用中文的句號代替英文句點) 英文句點符號:匹配單個任意字符侧但。...
    紅姑娘閱讀 4,365評論 0 2
  • python的re模塊--細說正則表達式 可能是東半球最詳細最全面的re教程,翻譯自官方文檔,因為官方文檔寫的是真...
    立而人閱讀 22,902評論 4 46