0001-正則表達(dá)式

正則表達(dá)式是用來進(jìn)行文本處理的技術(shù),是語言無關(guān)的,在幾乎所有語言中都有實(shí)現(xiàn)。

一個正則表達(dá)式就是由普通字符以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達(dá)式作為一個模板,將某個字符模式與所搜索的字符串進(jìn)行匹配。

就像通配符“*.jpg”、“%ab%”,它是對字符串進(jìn)行匹配的特殊字符串。

元字符

.:匹配任何單個字符。例如正則表達(dá)式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。

[ ] :匹配括號中的任何一個字符。例如正則表達(dá)式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括號中使用連字符“-”來指定字符的區(qū)間來簡化表示,例如正則表達(dá)式[0-9]可以匹配任何數(shù)字字符,這樣正則表達(dá)式“a[0-9]c”等價(jià)于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;還可以制定多個區(qū)間,例如“[A-Za-z]”可以匹配任何大小寫字母,“[A-Za-z0-9]”可以匹配任何的大小寫字母或者數(shù)字。

( ) :將() 之間括起來的表達(dá)式定義為“組”(group),并且將匹配這個表達(dá)式的字符保存到一個臨時區(qū)域,這個元字符在字符串提取的時候非常有用。把一些字符表示為一個整體。改變優(yōu)先級、定義提取組兩個作用。

| :將兩個匹配條件進(jìn)行邏輯“或”運(yùn)算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。

:匹配0至多個在它之前的子表達(dá)式,和通配符沒關(guān)系。例如正則表達(dá)式“zo”能匹配“z” 、“zo”以及“zoo”;因此“.”意味著能夠匹配任意字符串。"z(b|c)"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)"能匹配z、zab、zabab(用括號改變優(yōu)先級)。

  • :匹配前面的子表達(dá)式一次或多次,和*對比(0到多次)。例如正則表達(dá)式9+匹配9、99、999等。 “zo+”能匹配“zo”以及“zoo” ,不能匹配"z"。

? :匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。一般用來匹配“可選部分”。

{n} :匹配確定的n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的兩個“e”。

{n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。

{n,m} :最少匹配n 次且最多匹配m 次。“e{1,3}”將匹配“seeeeeeeed”中的前三個“e”。

^(shift+6) :匹配一行的開始。例如正則表達(dá)式“^regex”能夠匹配字符串“regex我會用”的開始,但是不能匹配“我會用regex”。

^另外一種意思:非!

:匹配行結(jié)束符。例如正則表達(dá)式“浮云” 能夠匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”

簡寫表達(dá)式

正則表達(dá)式是與語言無關(guān)真的就是想表達(dá)\d。

注意這些簡寫表達(dá)式是不考慮轉(zhuǎn)義符的,這里的\就表示字符\,而不是C#字符串級別的\,在C#代碼中需要使用@或者\(yùn)雙重轉(zhuǎn)義。區(qū)分C#級別的轉(zhuǎn)移和正則表達(dá)式級別的轉(zhuǎn)移,恰好C#的轉(zhuǎn)義符和正則表達(dá)式的轉(zhuǎn)義符都是\而已。正則表達(dá)式的轉(zhuǎn)移是在C#之后的(層層盤剝)。把C#的轉(zhuǎn)義符想成%就明白了。在C#看來@"-"就是-這個普通的字符串,只不過在正則表達(dá)式分析引擎看來他有了特殊含義。"\d"或者@"\d"

\d:代表一個數(shù)字,等同于[0-9]
\D:代表非數(shù)字,等同于[^0-9]
\s:代表換行符、Tab制表符等空白字符
\S:代表非空白字符
\w:匹配字母或數(shù)字或下劃線或漢字,即能組成單詞的字符
\W:非\w ,等同于[^\w]

d:digital;s:space、w:word。大寫就是“非”

.Net中的正則表達(dá)式

正則表達(dá)式在.Net就是用字符串表示,這個字符串格式比較特殊,無論多么特殊,在C#語言看來都是普通的字符串,具體什么含義由Regex類內(nèi)部進(jìn)行語法分析。
正則表達(dá)式(RegularExpression)的主要類:Regex.IsMatch方法用于判斷一個字符串是否匹配正則表達(dá)式。
字符串匹配例子:

Regex.IsMatch("bbbbg","^b.*g $");   
Regex.IsMatch("bg","^b.*g $ ");
Regex.IsMatch("gege","^b.*g $ ");

一定不能忘了^和$,否則也能匹配yesbagit
字符串提取
正則表達(dá)式還可以用來進(jìn)行字符串提取

Match match =Regex.Match("age=30", @"^(. +)=(.+)$");
if (match.Success)
{
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2] .Value);
}

match的Success屬性表示是否匹配成功;正則表達(dá)式中用()將要提取的內(nèi)容括起來,然后就可以通過Match的Groups屬性來得到所有的提取元素,注意Groups的序號是從1開始的,0有特殊含義

貪婪模式與非貪婪模式

從文本提取出名字:
Matchmatch = Regex.Match("大家好。我是S.H.E。我22歲了。我病了,嗚嗚。fffff","我是(.+)。");//沒有加^$。
看結(jié)果。+、的匹配默認(rèn)是貪婪(greedy)的:盡可能多的匹配,直到“再貪婪一點(diǎn)兒”其后的匹配模式就沒法匹配為止。
在+、
后添加?就變成非貪婪模式(? 的另外一個用途):讓其后的匹配模式盡早的匹配。修改成"我是(.+?)。"
一般開發(fā)的時候不用刻意去修飾為非貪婪模式,只有遇到bug的時候發(fā)現(xiàn)是貪婪模式的問題再去解決。因?yàn)樨澙沸矢摺?/p>

匹配組

正則表達(dá)式可以從一段文本中將所有符合匹配的內(nèi)容都輸出出來。Match獲得的是匹配的第一個。Regex.Matches方法可以獲得所有的匹配項(xiàng)。注意區(qū)別:匹配和group的區(qū)別:
MatchCollectionmatches = Regex.Matches("大家好,我是克魯斯(cluz)、我是杰克遜(MJ)、我是湯姆(tom)、復(fù)方法", @"我是(\w+?)((\w+?))、");//匹配出符合正則表達(dá)式的多個項(xiàng)

            for (int i = 0; i < matches.Count;i++)
            {
                Match match = matches[i];
                Console.WriteLine(match.Value);
                string cname =match.Groups[1].Value;
                string ename =match.Groups[2].Value;
                Console.WriteLine("中文名:{0},英文名:{1}",cname,ename);
            }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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