本章主要想和大家分享下正則表達式的一些基礎用法,希望能夠對一些小白有所幫助,也為了防止自己以後遺忘相關知識點。 ...
本章主要想和大家分享下正則表達式的一些基礎用法,希望能夠對一些小白有所幫助,也為了防止自己以後遺忘相關知識點,下麵我們正式進入主題。
一、正則表達式
1、正則表達式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。
2、正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。
3、在編寫處理字元串的程式或網頁時,經常會有查找或替換符合某些複雜規則的字元串的需要。
4、正則表達式就是記錄文本規則的代碼。
作用:
1、查找數據
2、替換數據
正則表達式能做什麼(字元串的匹配、字元串的提取、字元串的替換)
二、正則表達式的構成
1、普通字元
這包括所有的大小寫字母字元,所有數字,所有標點符號以及一些特殊符號。
例如:Hello world xyh666
2、定義字元集(取值範圍)(該點都是匹配單個字元,要想匹配字元串需要結合限定符來實現)
[a-e] 表示a到e這些字元中的某一個字元
[aeiou] 表示aeiou這5個字元其中的某一個字元
[a-zA-Z] 表示大寫、小寫字母中的某一個字元
[0-9] 表示0到9之間某一個數字
^ 代表非
[^lsjd] :不是中括弧中的任意一個字元
[^a-f] :a-f範圍外的任意一個字元
3、組合字元(大寫表示非)(該點都是匹配單個字元,要想匹配字元串需要結合限定符來實現)
\d :匹配一個數字字元。等價於[0-9]。
\D :匹配一個非數字字元。等價於[^0-9]。
\w :匹配一個字母或一個數字或一個下劃線或一個漢字。
\W :匹配一個非字母、非數字、非下劃線和非漢字的字元。
\s :匹配一個任意的空白符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S :匹配任意一個非空白符。等價於[^ \f\n\r\t\v]。
\b :匹配單詞的開始或結束的位置。
\B :匹配不是單詞開頭或結束的位置。
4、特殊字元
$ :表示字元串的結尾位置(以什麼結尾)
^ :表示字元串的開始位置(以什麼開始)(在取值範圍中還表示非)
. :一個點表示匹配一個除換行符 \n之外的任何單字元(匹配單個字元,要想匹配字元串需要結合限定符來實現)
| :或者的意思,指明兩項之間的一個選擇 與[...]類似
\ :這個符號是用來轉義的
( ) :分組,標記一個子表達式的開始和結束位置
5、常用限定符
=================匹配次數=================
{m} :其前一單元嚴格出現m次(重覆m次)
{m,} :其前一單元出現至少m次(重覆m次或更多次)
{m,n} :其前一單元出現至少m次,最多n次(重覆m到n次)
=======================================
=================多次匹配=================
* :其前面那個單元出現0次或任意次數(重覆零次或更多次)
+ : 其前面那個單元出現1次或1次以上 至少匹配一次(重覆一次或更多次)
? : 其前面那個單元出現0次或1次(重覆零次或一次)懶惰匹配(儘可能短匹配)
=======================================
6、貪婪與懶惰(貪婪模式和非貪婪模式)(儘可能長匹配和儘可能短匹配)
*? 重覆任意次,但儘可能少重覆
+? 重覆1次或更多次,但儘可能少重覆
?? 重覆0次或1次,但儘可能少重覆
{n,m}? 重覆n到m次,但儘可能少重覆
{n,}? 重覆n次以上,但儘可能少重覆
7、分組
當用()定義了一個正則表達式組後,正則引擎則會把被匹配的組按照順序編號,存入緩存。
預設情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括弧為標誌,第一個出現的分組的組號為1,第二個為2,以此類推。
我們可以通過“\數字”的方式進行引用已經存入緩存的組。\1引用第一個匹配的組,\2引用第二個組,以此類推。
括弧內的內容會被當成一個整體進行匹配。
8、非獲取匹配和預查
非獲取匹配:是指正則引擎不會把被匹配的組存入緩存,我們也無法通過“\數字”的方式進行引用我們的組。
預查:預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始。(即用來預查的表達式字元串不會被消耗)
(?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以後使用。這在使用或字元“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。
(?=pattern) 非獲取匹配,正向肯定預查,在任何匹配pattern的字元串開始處匹配查找字元串,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始。
(?!pattern) 非獲取匹配,正向否定預查,在任何不匹配pattern的字元串開始處匹配查找字元串,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!patte_n) 非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
三、C#代碼調用正則表達式
命名空間 System.Text.RegularExpressions 1、new Regex(正則表達式).IsMatch(要匹配的字元串) 返回bool 2、Regex.Match Match match = Regex.Match("age=30", @"^(.+)=(.+)$"); if (match.Success) { Console.WriteLine(match.Groups[0].Value);//第0組 輸出完整的字元串 age=30 Console.WriteLine(match.Groups[1].Value);//第1組 age Console.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); }
四、示例說明
接下來針對第二大點的內容我們舉些例子來說明:
未完待續.......
正則表達式測試器:
鏈接:https://pan.baidu.com/s/1CwyrLH2dwbBk1KVi2FCGDw 提取碼:nwyc
版權聲明:本文部分描述摘自網路,如有雷同純屬巧合,如有侵權請及時聯繫本人修改,謝謝!!!