精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
正則表達(dá)式總結(jié)

第一點(diǎn):--------------有關(guān)正則前沿介紹 正則表達(dá)式是用來進(jìn)行文本處理的技術(shù),是語言無關(guān)的,在幾乎所有語言中都有實(shí)現(xiàn)。javascript中還會(huì)用到。一個(gè)正則表達(dá)式就是由普通字符以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。就像通配符“*.jpg”、“%ab%”,它是對(duì)字符串進(jìn)行匹配的特殊字符串正則表達(dá)式是非常復(fù)雜的,不要希望一次都掌握,理解正則表達(dá)式能做什么(字符串的匹配、字符串的提取、字符串的替換),掌握常用的正則表達(dá)式用法,以后用到再查就行。

第二點(diǎn):--------------有關(guān)正則使用地方 項(xiàng)目中的采集器、敏感詞過濾、URLRewite、Validator也會(huì)涉及到正則表達(dá)式。

第三點(diǎn):--------------元字符介紹 要想學(xué)會(huì)正則表達(dá)式,理解元字符是一個(gè)必須攻克的難關(guān)。不用刻意記

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

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

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

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

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

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

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

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

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

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

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

   12)^另外一種意思:非!(暫時(shí)不用理解)

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

第三點(diǎn):-------------簡(jiǎn)寫正則表達(dá)式 注意這些簡(jiǎn)寫表達(dá)式是不考慮轉(zhuǎn)義符的,這里的\就表示字符\,而不是C#字符串級(jí)別的\,在C#代碼中需要使用@或者\(yùn)雙重轉(zhuǎn)義。

區(qū)分C#級(jí)別的轉(zhuǎn)移和正則表達(dá)式級(jí)別的轉(zhuǎn)移,恰好C#的轉(zhuǎn)義符和正則表達(dá)式的轉(zhuǎn)義符都是\而已。正則表達(dá)式的轉(zhuǎn)移是在C#之后的(層層盤剝)。

把C#的轉(zhuǎn)義符想成%就明白了。在C#看來@"\-"就是\-這個(gè)普通的字符串,只不過在正則表達(dá)式分析引擎看來他有了特殊含義。

"\\d"或者@"\d" \d:代表一個(gè)數(shù)字,等同于[0-9]

\D:代表非數(shù)字,等同于[^0-9]

\s:代表換行符、Tab制表符等空白字符

\S:代表非空白字符

\w:匹配字母或數(shù)字或下劃線或漢字,即能組成單詞的字符

\W:非\w ,等同于[^\w] d:digital;s:space、w:word。

大寫就是“非”

第四點(diǎn):-------------.NET中的正則表達(dá)式 正則表達(dá)式在.Net就是用字符串表示,這個(gè)字符串格式比較特殊,無論多么特殊,在C#語言看來都是普通的字符串,具體什么含義由Regex類內(nèi)部進(jìn)行語法分析。

正則表達(dá)式(Regular Expression)的主要類:Regex.IsMatch方法用于判斷一個(gè)字符串是否匹配正則表達(dá)式。 字符串匹配例子: Regex.IsMatch("bbbbg","^b.*g $"); Regex.IsMatch("bg", "^b.*g $ "); Regex.IsMatch("gege", "^b.*g $ "); 一定不能忘了^和$,否則也能匹配yesbagit 案例1:判斷是否是合法的郵政編碼(6位數(shù)字) Regex.IsMatch("100830","^[0-9]{6}$") Regex.IsMatch("119", @"^\d{6}$"); 解釋:由元字符定義得知"[0-9]"表示0到9的任意字符,"{6}"表示前面的字符匹配6此,因此“[0-9]{6}”中的{6}表示對(duì)數(shù)字匹配6次(000000123)。簡(jiǎn)寫表達(dá)式得知“[0-9]”可以被“\d”代替,所以第二種寫法“\d{6}”也是正確的。 案例2:判斷一個(gè)字符串是不是身份證號(hào)碼,即是否是15或18位數(shù)字。 錯(cuò)誤寫法:Regex.IsMatch("123456789123456789", @"^\d{15}|\d{18}$"),表示15位數(shù)字開頭或者18位數(shù)字結(jié)尾 正確寫法:Console.WriteLine(Regex.IsMatch("0111111111111111", @"^\d{15}$|^\d{18}$"))或者@"^(\d{15}|\d{18})$" 案例3:判斷字符串是否為正確的國內(nèi)電話號(hào)碼,不考慮分機(jī)。 比如“010-95555”、“01095555”、“95555”都是正確的號(hào)碼。區(qū)號(hào)為3位或者4位。 Regex.IsMatch("123456-95555", @"^\d{3,4}\-?\d+$") "^\d{3,4}\-?\d+$"表示被匹配的字符序列應(yīng)該是由三至四位數(shù)字組成,由于長途區(qū)號(hào)的連字符“-”可有可無,所以這里使用“?”元字符進(jìn)行說明。由于連字符“-”在正則表達(dá)式 中有特殊含義(表示范圍,比如[0-9]),所以要對(duì)其進(jìn)行轉(zhuǎn)義。 案例4:判斷一個(gè)字符串是否是合法的Email地址。 一個(gè)Email地址的特征就是以一個(gè)字符序列開始,后邊跟著“@”符號(hào),后邊又是一個(gè)字符序列,后邊跟著符號(hào)“.”,最后是字符序列 Regex.IsMatch("email12@mail.com", @"^\w+@\w+\.\w+$"); []括號(hào)中的任意字符,\w字母、數(shù)字、下劃線,+一到多個(gè)。由于.在正則表達(dá)式中有特殊的含義,因此對(duì)于真正想表達(dá)“.”則需要轉(zhuǎn)移“\.”。 案例5: 1、匹配IP地址,4段用.分割的最多三位數(shù)字。 192.168.54.77、333.333.333.333假設(shè)都是正確的。 @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"。.是正則表達(dá)式中的特殊含義,因此需要轉(zhuǎn)義。 2、判斷是否是合法的日期格式“2008-08-08”。四位數(shù)字-兩位數(shù)字-兩位數(shù)字。進(jìn)一步嚴(yán)謹(jǐn)@"^\d{4}\-\d{2}\-\d{2}$" 3、判斷是否是合法的url地址,http://www.test.com/a.htm、ftp://127.0.0.1/1.txt。字符串序列://字符串序列。@"^\w+://.+$"。//簡(jiǎn)化的識(shí)別,項(xiàng)目中你搜“w3c URL 正則表達(dá)式”。.+而不是\w,否則"?id=1"中的?就不能匹配了。 http://www.test.com/a.aspx?id=1

第五點(diǎn):---------------字符串的提取 正則表達(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的序號(hào)是從1開始的,0 有特殊含義 案例:

1)從文件路徑中提取出文件名(包含后綴) @"^.+/(.+)$"。比如從c:/a/b.txt中提取出b.txt這個(gè)文件名出來。

項(xiàng)目中用Path.GetFileName更好。

貪婪模式。

2)從“June 26, 1951”中提取出月份June來。@"([a-zA-Z]+)\s+\d{1,2},\s*\d{4}"進(jìn)行匹配。月份和日之間是必須要有空格分割的,所以使用空白符號(hào)“\s”匹配所有的空白字符,此處的空格是必須有的,所以使用“+”標(biāo)識(shí)為匹配1至多個(gè)空格。之后的“,”與年份之間的空格是可有可無的,所以使用“*”表示為匹配0至多個(gè)

3)從Email中提取出用戶名和域名,比如從test@163.com中提取出test和163.com。 4)“192.168.10.5[port=21,type=ftp]”,這個(gè)字符串表示IP地址為192.168.10.5的服務(wù)器的21端口提供的是ftp服務(wù),其中如果“,type=ftp”部分被省略,則默認(rèn)為http服務(wù)。請(qǐng)用程序解析此字符串,然后打印出“IP地址為***的服務(wù)器的***端口提供的服務(wù)為***” ^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\[port=(\d{1,5})(,type=(\w+))?\]$

第六點(diǎn):---------------貪婪和非貪婪模式 從文本提取出名字: Match match = Regex.Match("大家好。我是S.H.E。我22歲了。我病了,嗚嗚。fffff", "我是(.+)。");//沒有加^$。

看結(jié)果。+、*的匹配默認(rèn)是貪婪(greedy)的:盡可能多的匹配,直到“再貪婪一點(diǎn)兒”其后的匹配模式就沒法匹配為止。 在+、*后添加?就變成非貪婪模式

(? 的另外一個(gè)用途):讓其后的匹配模式盡早的匹配。修改成"我是(.+?)。" 一般開發(fā)的時(shí)候不用刻意去修飾為非貪婪模式,只有遇到bug的時(shí)候發(fā)現(xiàn)是貪婪模式的問題再去解決。

第七點(diǎn):--------------匹配組 正則表達(dá)式可以從一段文本中將所有符合匹配的內(nèi)容都輸出出來。Match獲得的是匹配的第一個(gè)。 Regex.Matches方法可以獲得所有的匹配項(xiàng)。

注意區(qū)別:匹配和group的區(qū)別: 練習(xí):從一段文本中提取所有的數(shù)字 MatchCollection matches = Regex.Matches("大家好,我是Hebe,我22歲了,身高180,我們團(tuán)隊(duì)有3個(gè)女女!", @"\d+");

案例:從字符串中提取所有人名 MatchCollection matchs = Regex.Matches(“大家好。我們是S.H.E。我是S。我是H。嗚嗚。fffff", @"我是(.+?)。")

案例:從一個(gè)頁面提取所有Email地址,用WebClient,自己動(dòng)手寫Email群發(fā)器。 練習(xí):從網(wǎng)站抓取所有的圖片地址,下載到硬盤:MatchCollection matches = Regex.Matches(content, "border=0\\s*src=\"(.*?)\">"); 練習(xí):抓取所有超鏈接,特征:href="地址“ //MatchCollection matches = Regex.Matches(text, "<a\s*href="(.+?)"\s*"); 練習(xí):抓取新聞 采集工具 //MatchCollection //MatchCollection matchs = Regex.Matches(“大家好。我們是S.H.E。我是S。我是H。嗚嗚。fffff", @"我是(.+?)。"); //foreach (Match match in matchs) //{ // if (match.Success) // { // Console.WriteLine(match.Groups[1].Value); // } //}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C#正則表達(dá)式Regex類使用
C#利用正則表達(dá)式實(shí)現(xiàn)字符串搜索
Python基礎(chǔ)必掌握的re模塊支持的元字符9類使用詳解
全面剖析C#正則表達(dá)式
C#正則表達(dá)式快速入門(簡(jiǎn)介)
C#正則表達(dá)式整理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 桂东县| 深圳市| 镇赉县| 运城市| 伽师县| 深泽县| 德惠市| 建昌县| 司法| 佛坪县| 随州市| 武夷山市| 肇州县| 繁峙县| 定日县| 淳安县| 河南省| 民权县| 翼城县| 旬阳县| 鹤岗市| 辽阳县| 香格里拉县| 格尔木市| 双柏县| 阜阳市| 竹山县| 岚皋县| 鄂托克旗| 商南县| 台北县| 秦皇岛市| 大英县| 霍城县| 鸡泽县| 东乡县| 崇左市| 工布江达县| 碌曲县| 滁州市| 双鸭山市|