a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Regex > 正文

關(guān)于C#中的正則表達(dá)式

2024-09-07 17:40:09
字體:
供稿:網(wǎng)友

你們將看到的一篇關(guān)于C#中的正則表達(dá)式,相信還是有許多同學(xué)還不了解的,沒關(guān)系,本文正中你所需,接下來錯(cuò)新小編就給初學(xué)者們耐心的訴說,你們可要認(rèn)真看喔。

Jeffrey?E.F.?Friedl寫了一本關(guān)于正則表達(dá)式的書《精通正則表達(dá)式》。作者為了使讀者更好的理解和掌握正則表達(dá)式,編造了一個(gè)故事。該書的語言以perl為主。據(jù)我所知C#中的正則表達(dá)式也是基于perl5。所以它們應(yīng)該有許多的共同之處。?
其實(shí),我并不打算原封不動(dòng)的對(duì)該書的內(nèi)容進(jìn)行翻譯,一則這本書內(nèi)容太多了,我根本就不勝任翻譯這項(xiàng)工作;二則如果我真的把這本書翻譯過來,同時(shí)把里面的代碼換成C#,在沒有征得原作者的情況下,可能有侵權(quán)的嫌疑了。所以,權(quán)當(dāng)作讀書筆記好了。?

略過冗長(zhǎng)的前言,我們可以直接進(jìn)入第一章:?

介紹正則表達(dá)式?

作者說這一章是為正則表達(dá)式的絕對(duì)菜鳥而準(zhǔn)備的,目的是為以后的章節(jié)打下堅(jiān)實(shí)的基礎(chǔ)。那么如果你是不是菜鳥,你可以忽略這一章。?

故事場(chǎng)景:?
你的檔案部的頭兒想要一個(gè)工具用來檢查重復(fù)的單詞(如:this?this),一個(gè)在大量編輯文檔的時(shí)候通常會(huì)遇到的問題。你的工作就是創(chuàng)建一個(gè)解決方案:?
接受任何數(shù)量要檢查的文件,報(bào)告每個(gè)文件中帶有重復(fù)單詞的那些行,突出顯示這些重復(fù)的單詞,同時(shí)確保原文件名稱和這些行出現(xiàn)在報(bào)表中。?
跨行檢查,找到一行的最后一個(gè)單詞和下一行開頭第一個(gè)單詞出現(xiàn)重復(fù)的情況。?
找出重復(fù)的單詞,不管他們是否大小寫不同(如:The?the),以及允許在這些重復(fù)單詞之間含有不同數(shù)量的空白字符(空格、制表符、新行等)?
找出重復(fù)的單詞,甚至這些單詞被Html標(biāo)簽隔開。(如:…it?is?<B>very</B>?very?important.)?

要解決上述的實(shí)際問題,我們首先要做的就是寫出正則表達(dá)式,找到我們想要的文本,忽略我們不需要的文本,然后使用我們的C#代碼對(duì)獲取的文本進(jìn)行處理。?

在使用正則表達(dá)式之前,你也許多少已經(jīng)知道什么是正則表達(dá)式。甚至你不知道,你幾乎可以肯定已經(jīng)熟悉它的基本概念了。?
你知道report.txt是一個(gè)具體的文件名稱,但是如果你有任何Unix或者DOS/Windows的經(jīng)驗(yàn),你也知道“*.txt”可以用來選擇多個(gè)文件。這種形式的文件名,有一些字符有著特殊的含義。星號(hào)意味著匹配任何東西,問號(hào)意味著匹配一個(gè)字符。如:“*.txt”表示任何文件名以.txt結(jié)尾的文件。?
文件名稱得模式匹配,使用了有限的匹配符。還有當(dāng)前網(wǎng)絡(luò)上的搜索引擎也允許使用某些指定的匹配符來進(jìn)行內(nèi)容搜索。正則表達(dá)式采用豐富的匹配字符,可以處理各種復(fù)雜的問題。?

首先我們介紹兩個(gè)位置匹配符:?
^?:?表示一行文字的開始位置?
$?:?表示一行文字的結(jié)束位置?

如:表達(dá)式:"^Cat",?匹配的單詞Cat出現(xiàn)在行的開始處,注意^是一個(gè)位置字符,不是要匹配字符的本身。?
同樣,表達(dá)式:"Cat$"?匹配的單詞Cat出現(xiàn)來一行的結(jié)尾處。?

接下來,我們介紹表達(dá)式中的方括號(hào)"[]",?它表示匹配括號(hào)中字符中的一個(gè)。如:?
表達(dá)式:"[0123456789]"將匹配數(shù)字0到9的任何一個(gè)。?
例如:我們要查找文本中,所有包含gray或者grey,那么表達(dá)式可以這么寫:"gr[ea]y"?
[ea]表示匹配ea中的一個(gè),而不是整個(gè)ea。?

如果我們要匹配html中的<H1><H2><H3><H4><H5><H6>的標(biāo)簽,我們可以寫表達(dá)式:?
"<H[123456]>",但是如果我們要匹配所有字符中的一個(gè)呢?哈,問題就來了,在方括號(hào)中寫出所有的字符?很幸運(yùn),我們不必這么做,我們引進(jìn)范圍符號(hào)"-";?
使用范圍符號(hào),我們只需要給出一個(gè)范圍的邊界字符即可,上面的Html例子,我們可以寫成:"<H[1-6]>"?
而表達(dá)式:"[0-9a-zA-Z]"的意思現(xiàn)在清楚了吧?它匹配數(shù)字字符,小寫26個(gè)字母和大寫26個(gè)字母中的一個(gè)。?

出現(xiàn)在[]中的"^"符號(hào)?
如果你看到表達(dá)式如:"[^0-9]",此時(shí),"^"不再是前面說的位置符號(hào),這里它是否定符號(hào),表示排除的意思,上面的表達(dá)式,表示不包含數(shù)字0到9的字符。?

思考1:表達(dá)式"q[^u]"的意思。假如有下列的單詞,那些將被匹配??
Iraqi?
Iraqian?
miqra?
qasida?
qintar?
qoph?
zaqqum?


除了范圍字符的表示之外,還有一個(gè)是點(diǎn)字符".",點(diǎn)字符出現(xiàn)在表達(dá)式中,表示匹配任何字符。?
如表達(dá)式:"07.04.76"將匹配:?
形如:07/04/76,?07-04-76,07.04.76。?

如果我們需要在某些字符中可選擇,我們可以采用選項(xiàng)字符"|":?
選項(xiàng)字符有“或"的意思,比如表達(dá)式:"[Bob|Robert]"則表示Bob或者Robert將被匹配。?
現(xiàn)在看我們前面提到的表達(dá)式:"gr[ea]y"?,利用選項(xiàng)字符我們可以寫作"grey|gray",它們是相同的。?
圓括號(hào)的使用:圓括號(hào)在表達(dá)式中也是被作為元字符使用,如前面的表達(dá)式,我們可以寫成:"gr(e|a)y",這里的圓括號(hào)是必須的,如果沒有圓括號(hào),那么表達(dá)式"gre|ay"將匹配gre或者ay,這不是我們想要的結(jié)果。如果你還不是很清楚,讓我們看一下下面的例子:?
在電子郵件中查找所有以From:或者Subject:或者Date:開頭的行,我們比較下面的兩個(gè)表達(dá)式:?
表達(dá)式1:"^From|Subject|Data:?"?
表達(dá)式2:"^(From|Subject|Data):?"?
哪一個(gè)是我們想要的??
很明顯,表達(dá)式1的結(jié)果不是我們想要的結(jié)果,它匹配的將是:From或者Subjec或者Data:?,表達(dá)式2使用圓括符,就能滿足我們的需要。?

單詞邊界?
我們已經(jīng)可以匹配出現(xiàn)在行首和行尾的字符,那么如果我們想定位的不僅僅是行首或者行尾呢?我們需要引入單詞邊界符號(hào),單詞邊界符號(hào)是:"/b",斜杠不可省略,否則變成匹配字母b。使用單詞邊界符號(hào),我們可以定位匹配的位置必須出現(xiàn)在一個(gè)單詞的開始或者結(jié)尾部分,而不是在單詞的中間。例如:"/bis/b"表達(dá)式在字符串"This?is?a?cat."中將匹配單詞"is"而不會(huì)匹配單詞"This"中的"is"。?

字符串邊界符號(hào)?
除了上述的位置符號(hào),如果我們要匹配的是整個(gè)字符串(含多個(gè)單詞)那么我們可以使用下面的兩個(gè)符號(hào):?
/A?:表示字符串的開始處;?
/z?:表示字符串的結(jié)束處。?
表達(dá)式:"/AThis?is?a?cat/z"將匹配這個(gè)字符串"This?is?a?cat"。?
使用邊界定位符號(hào),這里要提到一個(gè)重要的概念,那就是單詞字符,單詞字符表示可以構(gòu)成單詞的字符,它們是[a-zA-Z0-9]中的任意一個(gè)字符。所以上面的表達(dá)式也會(huì)在句子"This?is?a?cat."得到匹配。匹配的結(jié)果不包含句號(hào)。?


重復(fù)數(shù)量符號(hào)?
讓我們看表達(dá)式:"Colou?r",?這個(gè)表達(dá)式中出現(xiàn)了我們還沒有見過的問號(hào),(這個(gè)問號(hào)和文件名稱匹配的問號(hào)意義不同),它表示符號(hào)前面的一個(gè)字符可以被重復(fù)的次數(shù),"?"表示0次或者1次,前面的表達(dá)式中問號(hào)表示u可以出現(xiàn)0或1次,所以它將匹配"Color"或者"Colour"。?
下面是其他的重復(fù)數(shù)量符號(hào):?
+?:表示1次或者多次?
*?:表示0次或者多次?
例如我們要表示一或多個(gè)空格,我們可以寫表達(dá)式:"?+";?

如果要表示具體次數(shù)呢?我們引入花括符{}。?
{n}?:?n是具體的數(shù)字,表示重復(fù)n次。?
{n,m}:?表示最少那次,最多m次。?

這些符號(hào)都限定了符號(hào)前面一個(gè)字符的匹配次數(shù)。但是如果你想重復(fù)多個(gè)字符,比如一個(gè)單詞,那么怎么辦?我們?cè)俅问褂脠A括號(hào),前面我們把圓括號(hào)作為選項(xiàng)的范圍符號(hào),這里是圓括的另外一種使用方法,它被表示為一個(gè)組,例如表達(dá)式:“(this)"這里的this就是一個(gè)組,那么問題就好辦了,重復(fù)數(shù)量符號(hào)可以用來表示它前面一個(gè)組的重復(fù)次數(shù)。?

現(xiàn)在回到查找重復(fù)單詞的問題,假如我們要找到“the?the”,根據(jù)我們迄今為止學(xué)到的知識(shí),我們可以寫出表達(dá)式:?
"/bthe?+the/b"?
表達(dá)式的意思是匹配兩個(gè)the中間有一個(gè)或多個(gè)空格隔開。?
同樣,我們還可以寫成:?
"/b(the?+){2}"?

但是如果要找全部可能的重復(fù)單詞呢?我們目前的知識(shí)還不足以解決這個(gè)問題,下面我們引進(jìn)反向引用的概念,我們已經(jīng)看到圓括號(hào)可以作為組的邊界,一個(gè)表達(dá)式中可以有多個(gè)被圓括號(hào)限定的組,根據(jù)它們出現(xiàn)的次序,這些組缺省的被分配了一個(gè)組號(hào),第一個(gè)出現(xiàn)的組號(hào)為1號(hào),依次類推。那么反向引用就是可以在之后的表達(dá)式的位置上是使用"/n"來引用這個(gè)組,這里n是被引用的組號(hào)。反向引用就像是程序中的變量一樣,下面我們看具體的例子:?
前面的單詞重復(fù)表達(dá)式,現(xiàn)在我們采用反向引用可以寫做:?
"/b(the)?+/1/b"?
現(xiàn)在,如果我們要匹配所有的重復(fù)單詞,我們就可以改寫表達(dá)式為:?
"/b([a-zA-Z]+)?+/1/b"?

最后一個(gè)問題是,如果我們要匹配的字符是正則表達(dá)式中的符號(hào),怎么辦?對(duì),使用轉(zhuǎn)義符號(hào)"/",?例如如果你要匹配一個(gè)小數(shù)點(diǎn),那么你可以:"/.",還要注意的是如果在程序中使用表達(dá)式那么"/"也要按照字符串的規(guī)定變成"http://"或者在表達(dá)式前面加@。?

本文只是給初學(xué)者一個(gè)關(guān)于正則表達(dá)式的基礎(chǔ)知識(shí),它只是其中的部分,我們需要學(xué)習(xí)的東西還很多,錯(cuò)新技術(shù)小編將在以后的工作中給同學(xué)們一一介紹。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美一级片在线 | 91在线观看视频 | 亚洲一级片 | 在线一级视频 | 99色在线| 国产免费拔擦拔擦8x高清 | 欧美日韩国产高清视频 | a级网站在线观看 | 午夜精品久久久久久久久久久久 | 精品影视一区二区 | 国产日本欧美一区二区三区 | 日本黄色大片免费 | 杏导航aⅴ福利网站 | 精品在线播放 | 激情视频区| www.sihu| 精品成人佐山爱一区二区 | 在线免费观看av片 | 欧美性一区二区 | 日韩一区免费观看 | 免费在线日本 | 欧美国产日韩在线观看 | 99re热精品视频 | 亚洲一区视频在线 | 91免费在线 | 午夜寂寞少妇aaa片毛片 | 天天澡天天狠天天天做 | 四虎影视最新免费版 | 狠狠操综合网 | 欧美视频网站 | 亚洲精品欧美视频 | 国产成人免费视频 | 亚洲精品久久久久久久久 | 欧美色道| 91原创视频在线观看 | 欧美在线视频一区 | 日韩欧美久久 | 国产一区在线免费观看 | 91精品视频一区 | 最新天堂中文在线 | 亚洲在线免费观看 |