本章主要想和大家分享下正則表達(dá)式的一些基礎(chǔ)用法,希望能夠?qū)σ恍┬“子兴鶐椭矠榱朔乐棺约阂院筮z忘相關(guān)知識點(diǎn),下面我們正式進(jìn)入主題。 一、正則表達(dá)式 1、正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。 作用: 二、正則表達(dá)式的構(gòu)成1、普通字符(如果直接寫多個普通字符,則會被當(dāng)做一個整體的字符串來匹配) 這包括所有的大小寫字母字符,所有數(shù)字,所有標(biāo)點(diǎn)符號以及一些特殊符號。 2、定義字符集(取值范圍)(該點(diǎn)都是匹配單個字符,要想匹配字符串需要結(jié)合限定符來實(shí)現(xiàn)) ^ 代表非 3、組合字符(大寫表示非)(該點(diǎn)都是匹配單個字符,要想匹配字符串需要結(jié)合限定符來實(shí)現(xiàn)) \d :匹配一個數(shù)字字符。等價于[0-9]。 4、特殊字符 $ :表示字符串的結(jié)尾位置(以什么結(jié)尾) 5、常用限定符 7、分組 當(dāng)用()定義了一個正則表達(dá)式組后,正則引擎則會把被匹配的組按照順序編號,存入緩存。 默認(rèn)情況下,每個分組會自動擁有一個組號,規(guī)則是:從左向右,以分組的左括號為標(biāo)志,第一個出現(xiàn)的分組的組號為1,第二個為2,以此類推。 我們可以通過“\數(shù)字”的方式進(jìn)行引用已經(jīng)存入緩存的組。\1引用第一個匹配的組,\2引用第二個組,以此類推。 括號內(nèi)的內(nèi)容會被當(dāng)成一個整體進(jìn)行匹配。 8、非獲取匹配和預(yù)查(零寬斷言) 非獲取匹配:是指正則引擎不會把被匹配的組存入緩存,我們也無法通過“\數(shù)字”的方式進(jìn)行引用我們的組。 預(yù)查:預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。(即用來預(yù)查的表達(dá)式字符串不會被消耗,它只是用于指定一個位置) 零寬斷言:用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。 =========================================================================================== (?=exp)也叫零寬度正預(yù)測先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。 (?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。 =========================================================================================== (?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達(dá)式。 (?=pattern) 非獲取匹配,正向肯定預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。 (?!pattern) 非獲取匹配,正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。 (?<=pattern) 非獲取匹配,反向肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 (?<!patte_n) 非獲取匹配,反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 三、C#代碼調(diào)用正則表達(dá)式命名空間 System.Text.RegularExpressions 1、new Regex(正則表達(dá)式).IsMatch(要匹配的字符串) 返回bool2、Regex.Match Match match = Regex.Match("age=30", @"^(.+)=(.+)$");if (match.Success) { Console.WriteLine(match.Groups[0].Value);//第0組 輸出完整的字符串 age=30Console.WriteLine(match.Groups[1].Value);//第1組 ageConsole.WriteLine(match.Groups[2].Value);//第2組 30 }3、Regex.Matches StringBuilder sb = new StringBuilder(); sb.Append("<Name>張三</Name>\r\n<Name>李四</Name>\r\n<Name>王五</Name>"); MatchCollection mc = Regex.Matches(sb.ToString(), @"(?<=<Name>).*(?=</Name>)");foreach (Match m in mc) { Console.WriteLine(m.Value); } 四、示例說明接下來針對第二大點(diǎn)的內(nèi)容我們舉些例子來說明: 示例1(普通字符): 我們用 xyh 來匹配 xyh123 如下圖所示: 從上面的正則表達(dá)式測試器匹配的結(jié)果可以看出:如果直接寫多個普通字符,則會被當(dāng)做一個整體的字符串來匹配。 示例2(元字符和限定符): 我們用 \d 來匹配 xyh123 如下圖所示: 從匹配的結(jié)果可以發(fā)現(xiàn)\d只是匹配單個數(shù)字,所以有三個結(jié)果,分別為1、2、3,那如果想匹配一整個字符串123要怎么辦呢?此時就要結(jié)合限定符來實(shí)現(xiàn)了。繼續(xù)來看下下面的一張圖。 從圖中可以看出結(jié)合限定符后就可以實(shí)現(xiàn)匹配到123這個字符串了。 示例3(普通字符和元字符組合): 我們用 https://www\..+\.com 來匹配這么一句話:https://www.jd.com兩個鏈接https://www.taobao.com 如下圖所示: 可以發(fā)現(xiàn)匹配的結(jié)果為完整的一整句話,那為什么不是匹配出2個結(jié)果分別為 https://www.jd.com 和 https://www.taobao.com 呢? 那是因?yàn)槟J(rèn)情況下正則表達(dá)式采用貪婪模式匹配(即盡可能多匹配),所以匹配出了完整的一句話,此時可以用?來實(shí)現(xiàn)非貪婪模式匹配(即盡可能少匹配),如下圖所示: 這樣就匹配出了2個結(jié)果 示例4(分組): 我們用 (abc)\1 來匹配 abcabc666 如下圖所示: 從圖中可以看出匹配結(jié)果為abcabc,為什么會是這樣呢?首先我們分組(abc)匹配到存入緩存中的值為abc,通過\1的方式就取到了存入緩存中的第1個分組值abc,這個分組值abc與原來分組(abc)匹配到的字符串a(chǎn)bc組成新的匹配字符串a(chǎn)bcabc,用新的匹配字符串a(chǎn)bcabc去匹配abcabc666得到的匹配結(jié)果就是abcabc了。 示例5(非獲取匹配): 非獲取匹配(?:pattern)如下圖所示: 從圖中可以看出非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲供以后使用。因此無法通過“\數(shù)字”的方式來獲取。 示例6(預(yù)查和零寬斷言): 預(yù)查不消耗字符,它只是用于指定一個位置,如下圖所示: 從圖中可以看出用 ab(?=a) 來匹配 ababa123 時會得到兩個結(jié)果而不是一個結(jié)果,那是因?yàn)轭A(yù)查不消耗字符(即不會消耗用來預(yù)查用的表達(dá)式exp對應(yīng)的字符),它只是用于指定一個位置,所以在第3個位置的a(即第2個a)沒有被消耗掉。當(dāng)匹配到第1個結(jié)果ab后會從第3個位置的a(即第2個a)開始查找下一個能匹配的字符串,而不是從第4個位置的b(即第2個b)開始查找,這就解釋了為什么會匹配到2個結(jié)果了。 PS:本文僅是個人見解 ,如有表述錯誤歡迎評論指正! 正則表達(dá)式測試器: 鏈接:https://pan.baidu.com/s/1CwyrLH2dwbBk1KVi2FCGDw 提取碼:nwyc |
|