国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Regex > 正文

C#中的正則表達式 學習資料

2020-03-16 21:21:18
字體:
供稿:網(wǎng)友

C#中的正則表達式

JeffreyE.F.Friedl寫了一本關(guān)于正則表達式的書《精通正則表達式》。作者為了使讀者更好的理解和掌握正則表達式,編造了一個故事。該書的語言以perl為主。據(jù)我所知C#中的正則表達式也是基于perl5。所以它們應(yīng)該有許多的共同之處。http://ike.126.com

其實,我并不打算原封不動的對該書的內(nèi)容進行翻譯,一則這本書內(nèi)容太多了,我根本就不勝任翻譯這項工作;二則如果我真的把這本書翻譯過來,同時把里面的代碼換成C#,在沒有征得原作者的情況下,可能有侵權(quán)的嫌疑了。所以,權(quán)當作讀書筆記好了。

略過冗長的前言,我們可以直接進入第一章:

介紹正則表達式

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

故事場景:

你的檔案部的頭兒想要一個工具用來檢查重復的單詞(如:thisthis),一個在大量編輯文檔的時候通常會遇到的問題。你的工作就是創(chuàng)建一個解決方案:

接受任何數(shù)量要檢查的文件,報告每個文件中帶有重復單詞的那些行,突出顯示這些重復的單詞,同時確保原文件名稱和這些行出現(xiàn)在報表中。

跨行檢查,找到一行的最后一個單詞和下一行開頭第一個單詞出現(xiàn)重復的情況。

找出重復的單詞,不管他們是否大小寫不同(如:Thethe),以及允許在這些重復單詞之間含有不同數(shù)量的空白字符(空格、制表符、新行等)

找出重復的單詞,甚至這些單詞被Html標簽隔開。(如:…itisveryveryimportant.)

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

在使用正則表達式之前,你也許多少已經(jīng)知道什么是正則表達式。甚至你不知道,你幾乎可以肯定已經(jīng)熟悉它的基本概念了。

你知道report.txt是一個具體的文件名稱,但是如果你有任何Unix或者DOS/Windows的經(jīng)驗,你也知道“*.txt”可以用來選擇多個文件。這種形式的文件名,有一些字符有著特殊的含義。星號意味著匹配任何東西,問號意味著匹配一個字符。如:“*.txt”表示任何文件名以.txt結(jié)尾的文件。

文件名稱得模式匹配,使用了有限的匹配符。還有當前網(wǎng)絡(luò)上的搜索引擎也允許使用某些指定的匹配符來進行內(nèi)容搜索。正則表達式采用豐富的匹配字符,可以處理各種復雜的問題。

首先我們介紹兩個位置匹配符:

^:表示一行文字的開始位置

$:表示一行文字的結(jié)束位置

如:表達式:"^Cat",匹配的單詞Cat出現(xiàn)在行的開始處,注意^是一個位置字符,不是要匹配字符的本身。

同樣,表達式:"Cat$"匹配的單詞Cat出現(xiàn)來一行的結(jié)尾處。

接下來,我們介紹表達式中的方括號"[]",它表示匹配括號中字符中的一個。如:

表達式:"[0123456789]"將匹配數(shù)字0到9的任何一個。

例如:我們要查找文本中,所有包含gray或者grey,那么表達式可以這么寫:"gr[ea]y"

[ea]表示匹配ea中的一個,而不是整個ea。

如果我們要匹配html中的

 

 

 

 

 
的標簽,我們可以寫表達式:

 

"",但是如果我們要匹配所有字符中的一個呢?哈,問題就來了,在方括號中寫出所有的字符?很幸運,我們不必這么做,我們引進范圍符號"-";

使用范圍符號,我們只需要給出一個范圍的邊界字符即可,上面的Html例子,我們可以寫成:""

而表達式:"[0-9a-zA-Z]"的意思現(xiàn)在清楚了吧?它匹配數(shù)字字符,小寫26個字母和大寫26個字母中的一個。

出現(xiàn)在[]中的"^"符號

如果你看到表達式如:"[^0-9]",此時,"^"不再是前面說的位置符號,這里它是否定符號,表示排除的意思,上面的表達式,表示不包含數(shù)字0到9的字符。

思考1:表達式"q[^u]"的意思。假如有下列的單詞,那些將被匹配?

Iraqi

Iraqian

miqra

qasida

qintar

qoph

zaqqum

除了范圍字符的表示之外,還有一個是點字符".",點字符出現(xiàn)在表達式中,表示匹配任何字符。

如表達式:"07.04.76"將匹配:

形如:07/04/76,07-04-76,07.04.76。

如果我們需要在某些字符中可選擇,我們可以采用選項字符"|":

選項字符有“或"的意思,比如表達式:"[Bob|Robert]"則表示Bob或者Robert將被匹配。

現(xiàn)在看我們前面提到的表達式:"gr[ea]y",利用選項字符我們可以寫作"grey|gray",它們是相同的。

圓括號的使用:圓括號在表達式中也是被作為元字符使用,如前面的表達式,我們可以寫成:"gr(e|a)y",這里的圓括號是必須的,如果沒有圓括號,那么表達式"gre|ay"將匹配gre或者ay,這不是我們想要的結(jié)果。如果你還不是很清楚,讓我們看一下下面的例子:

在電子郵件中查找所有以From:或者Subject:或者Date:開頭的行,我們比較下面的兩個表達式:

表達式1:"^From|Subject|Data:"

表達式2:"^(From|Subject|Data):"

哪一個是我們想要的?

很明顯,表達式1的結(jié)果不是我們想要的結(jié)果,它匹配的將是:From或者Subjec或者Data:,表達式2使用圓括符,就能滿足我們的需要。

單詞邊界

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

字符串邊界符號

除了上述的位置符號,如果我們要匹配的是整個字符串(含多個單詞)那么我們可以使用下面的兩個符號:

/A:表示字符串的開始處;

/z:表示字符串的結(jié)束處。

表達式:"/AThisisacat/z"將匹配這個字符串"Thisisacat"。

使用邊界定位符號,這里要提到一個重要的概念,那就是單詞字符,單詞字符表示可以構(gòu)成單詞的字符,它們是[a-zA-Z0-9]中的任意一個字符。所以上面的表達式也會在句子"Thisisacat."得到匹配。匹配的結(jié)果不包含句號。

重復數(shù)量符號

讓我們看表達式:"Colou?r",這個表達式中出現(xiàn)了我們還沒有見過的問號,(這個問號和文件名稱匹配的問號意義不同),它表示符號前面的一個字符可以被重復的次數(shù),"?"表示0次或者1次,前面的表達式中問號表示u可以出現(xiàn)0或1次,所以它將匹配"Color"或者"Colour"。

下面是其他的重復數(shù)量符號:

+:表示1次或者多次

*:表示0次或者多次

例如我們要表示一或多個空格,我們可以寫表達式:"+";

如果要表示具體次數(shù)呢?我們引入花括符{}。

{n}:n是具體的數(shù)字,表示重復n次。

{n,m}:表示最少那次,最多m次。

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

現(xiàn)在回到查找重復單詞的問題,假如我們要找到“thethe”,根據(jù)我們迄今為止學到的知識,我們可以寫出表達式:

"/bthe+the/b"

表達式的意思是匹配兩個the中間有一個或多個空格隔開。

同樣,我們還可以寫成:

"/b(the+){2}"

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

前面的單詞重復表達式,現(xiàn)在我們采用反向引用可以寫做:

"/b(the)+/1/b"

現(xiàn)在,如果我們要匹配所有的重復單詞,我們就可以改寫表達式為:

"/b([a-zA-Z]+)+/1/b"

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

本章僅僅是提供給菜鳥一個關(guān)于正則表達式的基礎(chǔ)知識,它只是其中的部分,我們還有許多東西要學習,這將在后面的章節(jié)中一一介紹。其實,正則表達式的學習并不難,你需要的是耐心和實踐,如果你想精通它的話。或許有人說:“我不想知道汽車的細節(jié),我只想學會怎么開車。”如果你也是這樣想的,那么,你永遠也不知道怎么使用正則表達式來解決你的問題,進而,你也永遠不會懂得正則表達式的真正的強大。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 通城县| 盈江县| 鄯善县| 庄浪县| 楚雄市| 建湖县| 三原县| 鄂温| 泰安市| 银川市| 繁昌县| 寿光市| 阿荣旗| 广丰县| 友谊县| 石家庄市| 阜新市| 额敏县| 邵阳县| 同江市| 仁布县| 铜鼓县| 元江| 驻马店市| 桑植县| 仲巴县| 介休市| 扶风县| 寿阳县| 恭城| 大埔区| 屯留县| 诸城市| 常熟市| 阿鲁科尔沁旗| 双城市| 德江县| 舞阳县| 星座| 岳阳县| 陆丰市|