




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1、正則表達式簡介正則表達式提供了功能強大、靈活而又高效的方法來處理文本。正則表達式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或?qū)⑻崛〉淖址砑拥郊弦陨蓤蟾?。對于處理字符串(例?HTML 處理、日志文件分析和 HTTP 標(biāo)頭分析)的許多應(yīng)用程序而言,正則表達式是不可缺少的工具。 .NET 框架正則表達式并入了其他正則表達式實現(xiàn)的最常見功能,被設(shè)計為與 Perl 5 正則表達式兼容,.NET 框架正則表達式還包括一些在其他實現(xiàn)中尚未提供的功能,.NET 框架正則表達式類是基類庫的一部分,并且可以和面向公共語言運行庫的任何語言或工
2、具一起使用。2、字符串搜索正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。正是元字符組為正則表達式提供了處理能力。當(dāng)前,所有的文本編輯器都有一些搜索功能,通??梢源蜷_一個對話框,在其中的一個文本框中鍵入要定位的字符串,如果還要同時進行替換操作,可以鍵入一個替換字符串,比如在Windows操作系統(tǒng)中的記事本、Office系列中的文檔編輯器都有這種功能。這種搜索最簡單的方式,這類問題很容易用String類的String.Replace()方法來解決,但如果需要在文檔中識別某個重復(fù)的,該怎么辦?編寫一個例程,從一個String類中選擇重復(fù)的字是比較復(fù)雜的,此時使用語言就很適合。一
3、般表達式語言是一種可以編寫搜索表達式的語言。在該語言中,可以把文檔中要搜索的文本、轉(zhuǎn)義序列和特定含義的其他字符組合在一起,例如序列b表示一個字的開頭和結(jié)尾(子的邊界),如果要表示正在查找的以字符th開頭的字,就可以編寫一般表達式bth(即序列字符界是-t-h)。如果要搜索所有以th結(jié)尾的字,就可以編寫thb(序列t-h-字邊界)。但是,一般表達式要比這復(fù)雜得多,例如,可以在搜索操作中找到存儲部分文本的工具性程序(facility)。3、.NET 框架的正則表達式類下面通過介紹 .NET 框架的正則表達式類,熟悉一下.NET框架下的正則表達式的使用方法。3.1 Regex 類表示只讀正則表達式R
4、egex 類包含各種靜態(tài)方法,允許在不顯式實例化其他類的對象的情況下使用其他正則表達式類。以下代碼示例創(chuàng)建了 Regex 類的實例并在初始化對象時定義一個簡單的正則表達式。請注意,使用了附加的反斜杠作為轉(zhuǎn)義字符,它將 s 匹配字符類中的反斜杠指定為原義字符。Regex r; / 聲明一個 Regex類的變量r = new Regex("s2000"); / 定義表達式 3.2 Match 類表示正則表達式匹配操作的結(jié)果以下示例使用 Regex 類的 Match 方法返回 Match 類型的對象,以便找到輸入字符串中第一個匹配。此示例使用 Match 類的 Match.Suc
5、cess 屬性來指示是否已找到匹配。Regex r = new Regex("abc"); / 定義一個Regex對象實例Match m = r.Match("123abc456"); / 在字符串中匹配if (m.Success) Console.WriteLine("Found match at position " + m.Index); /輸入匹配字符的位置 3.3 MatchCollection 類表示非重疊匹配的序列該集合為只讀的,并且沒有公共構(gòu)造函數(shù)。MatchCollection 的實例是由 Regex.Matches
6、 屬性返回的。使用 Regex 類的 Matches 方法,通過在輸入字符串中找到的所有匹配填充 MatchCollection。下面代碼示例演示了如何將集合復(fù)制到一個字符串?dāng)?shù)組(保留每一匹配)和一個整數(shù)數(shù)組(指示每一匹配的位置)中。MatchCollection mc;String results = new String20;int matchposition = new int20;Regex r = new Regex("abc"); /定義一個Regex對象實例mc = r.Matches("123abc4abcd"); for (int i
7、= 0; i < mc.Count; i+) /在輸入字符串中找到所有匹配resultsi = mci.Value; /將匹配的字符串添在字符串?dāng)?shù)組中matchpositioni = mci.Index; /記錄匹配字符的位置 3.4 GroupCollection 類表示捕獲的組的集合該集合為只讀的,并且沒有公共構(gòu)造函數(shù)。GroupCollection 的實例在 Match.Groups 屬性返回的集合中返回。下面的控制臺應(yīng)用程序查找并輸出由正則表達式捕獲的組的數(shù)目。public static void RunTest() Regex r = new Regex("(a(b)
8、c"); /定義組Match m = r.Match("abdabc");Console.WriteLine("Number of groupspublic static void Main() RunTest(); 該示例產(chǎn)生下面的輸出:Number of groups found = 3 3.5 CaptureCollection 類表示捕獲的子字符串的序列 由于限定符,捕獲組可以在單個匹配中捕獲多個字符串。Captures屬性(CaptureCollection 類的對象)是作為 Match 和 group 類的成員提供的,以便于對捕獲的子字符串的
9、集合的訪問。例如,如果使用正則表達式 (a(b)c)+(其中 + 限定符指定一個或多個匹配)從字符串"abcabcabc"中捕獲匹配,則子字符串的每一匹配的 Group 的 CaptureCollection 將包含三個成員。下面的程序使用正則表達式 (Abc)+來查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一個或多個匹配,闡釋了使用 Captures 屬性來返回多組捕獲的子字符串。public static void RunTest() int counter;Match m;CaptureCollection cc;GroupColle
10、ction gc;Regex r = new Regex("(Abc)+"); /查找"Abc"m = r.Match("XYZAbcAbcAbcXYZAbcAb"); /設(shè)定要查找的字符串gc = m.Groups;/輸出查找組的數(shù)目Console.WriteLine("Captured/ Loop through each group.for (int i=0; i < gc.Count; i+) /查找每一個組cc = gci.Captures;counter = cc.Count;Console.WriteLi
11、ne("Captures count = " + counter.ToString();for (int ii = 0; ii < counter; ii+) / Print capture and position.Console.WriteLine(ccii + " Starts at character " + ccii.Index); /輸入捕獲位置public static void Main() RunTest(); 此例返回下面的輸出結(jié)果:Captured groups = 2Captures count = 1AbcAbcAbc S
12、tarts at character 3Captures count = 3Abc Starts at character 3Abc Starts at character 6Abc Starts at character 9 3.6 Capture 類包含來自單個子表達式捕獲的結(jié)果在 Group 集合中循環(huán),從 Group 的每一成員中提取 Capture 集合,并且將變量 posn 和 length 分別分配給找到每一字符串的初始字符串中的字符位置,以及每一字符串的長度。Regex r;Match m;CaptureCollection cc;int posn, length;r = ne
13、w Regex("(abc)*");m = r.Match("bcabcabc");for (int i=0; m.Groupsi.Value != "" i+) cc = m.Groupsi.Captures; for (int j = 0; j < cc.Count; j+) posn = ccj.Index; /捕獲對象位置length = ccj.Length; /捕獲對象長度 圖1:對象關(guān)系 把組合字符組合起來后,每次都會返回一個組對象,就可能并不是我們希望的結(jié)果。如果希望把組合字符作為搜索模式的一部分,就會有相當(dāng)大的
14、系統(tǒng)開銷。對于單個的組,可以用以字符序列"?:"開頭的組禁止這么做,就像URI樣例那樣。而對于所有的組,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture標(biāo)志。4、利用正則表達式實現(xiàn)字符串搜索4.1 在C#中使用.net一般表達式引擎下面將通過一個樣例的開發(fā),執(zhí)行并顯示一些搜索的結(jié)果,說明一般表達式的一些特性,以及如何在C#中使用.NET一般表達式引擎。說明使用字符串時應(yīng)在前面加上符號。String Text="I can not find my position in Beijing" 把這個文本稱為
15、輸入字符串,為了說明一般表達式.NET類,本文先進行一次純文本的搜索,這次搜索不帶任何轉(zhuǎn)義序列或一般表達式命令。假定要查找所有字符串ion,把這個搜索字符串稱為模式。使用一般表達式和上面聲明的變量Text,編寫出下面的代碼:String Pattern = "ion"MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);foreach(Match NextMatch in Matches) Console.WriteLine(NextMatch.Index); 一般集合的功能主要取決于模式字符串
16、。原因是模式字符串不僅僅包含純文本。如前所述。還包含元字符和轉(zhuǎn)義序列,元字符是給出命令的特殊字符,而轉(zhuǎn)義序列的工作方式與C#的轉(zhuǎn)義序列相同,它們都是以反斜杠開頭的字符,具有特殊的含義。例如,假定要查找以n開頭的字,就可以使用轉(zhuǎn)義序列b,它表示一個字的邊界(字的邊界是以某個字母數(shù)字標(biāo)的字符開頭,或者后面是一個空白字符或標(biāo)點符號),下面編寫如下代碼: String Pattern = "bn"MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase|RegexOptions.Expl
17、icitCapture); 要在運行時把b傳遞給.NET一般表達式引擎,反斜杠不應(yīng)被C#編譯器解釋為轉(zhuǎn)義序列。如果要查找以序列ion結(jié)尾的字,可以使用下面的代碼:String Pattern = "ionb" 如果要查找以字母n開頭,以序列ion結(jié)尾的所有字,需要一個以bn開頭,以ionb結(jié)尾的模式,中間內(nèi)容怎么辦?需要告訴計算機n和ion中間的內(nèi)容可以是任意長度的字符,只要字符不是空白即可,正確的模式如下所示:String Pattern = "bnS*ionb" 4.2 特定字符或轉(zhuǎn)義序列大多數(shù)重要的正則表達式語言運算符都是非轉(zhuǎn)義的單個字符。轉(zhuǎn)義符
18、(單個反斜杠)通知正則表達式分析器反斜杠后面的字符不是運算符。例如,分析器將星號 (*) 視為重復(fù)限定符,而將后跟星號的反斜杠 (*) 視為 Unicode 字符 002A。使用一般表達式要習(xí)慣的一點是,查看像這樣怪異的字符序列,但這個序列的工作是非常邏輯化的。轉(zhuǎn)義序列S表示任何不適空白的字符。*稱為數(shù)量詞,其含義是前面的字符可以重復(fù)任意次,包括0次。序列S*表示任何不適空白的字符。因此,上面的模式匹配于以n開頭,以ion結(jié)尾的任何單個字。下表中列出的字符轉(zhuǎn)義在正則表達式和替換模式中都會被識別。表1:特定字符或轉(zhuǎn)義序列特定字符或轉(zhuǎn)義序列 含義 樣例 匹配的樣例 輸入文本的開頭 B B,但只能是
19、文本中的第一個字符 $ 輸入文本的結(jié)尾 X$ X,但只能是文本中的最后一個字符 . 除了換行字符(n)以外的所有單個字符 i.ation isation、ization * 可以重復(fù)0次或多次的前導(dǎo)字符 ra*t rat、raat等 + 可以重復(fù)1次或多次的前導(dǎo)字符 ra+t rt、rat、raat等 ? 可以重復(fù)0次或1次的前導(dǎo)字符 ra?t 只有rt和rat匹配 s 任何空白字符 sa spacea,ta,na(t和n與C#的t和n含義相同) S 任何不是空白的字符 SF aF,rF,cF,但不能是tf b 字邊界 ionb 以ion結(jié)尾的任何字 B 不是字邊界的位置 BXB 字中間的任何
20、X 如果要搜索一個元字符,也可以通過帶有反斜杠的轉(zhuǎn)義字符來表示。例如,.表示除了換行字符以外的任何字符,而.表示一個點??梢园芽商鎿Q的字符放在方括號中,請求匹配包含這些字符。例如,1|c表示字符可以是1或者是c。如果要搜索map或者man,可以使用序列"man|p"(僅指引號內(nèi)字符,下面雷同)。在方括號中,也可以制定一個范圍,例如"a-z"表示所有的小寫字母(使用連字號 (-) 允許指定連續(xù)字符范圍),"B-F"表示B到F之間的所有大寫字母,"0-9"表示一個數(shù)字,如果要搜索一個整數(shù)(該序列只包含0到9的字符),就
21、可以編寫"0-9+"(注意,使用+字符表示至少要有這樣一個數(shù)字,但可以有多個數(shù)字,所以9、83和3443等都是匹配的。)下面看看一般表達式的結(jié)果,編寫一個實例RegularExpressionsZzy。建立幾個一般表達式,顯示其結(jié)果,讓用戶了解一下表達式是如何工作的。該實例的核心是一個方法WriteMatches(),它把MatchCollection中的所有匹配以比較詳細的方式顯示出來。對于每個匹配,它都會顯示該匹配在輸入字符串中所在的索引,匹配的字符串和一個略長的字符串,其中包含輸入文本中至多8個外圍字符,其中至少有5個字符放在匹配的前面,至多5個字符放在匹配的后面(如
22、果匹配的位置在輸入文本的開頭或結(jié)尾5個字符內(nèi),則結(jié)果中匹配前后的字符就會少于4個)。換言之,靠近輸入文本末尾的匹配應(yīng)是"and messaging ofd",匹配的前后各有5個字符,但位于輸入文本的最后一個字上的匹配就應(yīng)是"g of data",匹配的字后只有一個字符。因為在該字符的后面是字符串的結(jié)尾。這個長字符串可以更清楚地表明一般表達式是在什么地方查找到匹配的:static void WriteMatches(string text, MatchCollection matches)Console.WriteLine("Original t
23、ext was: nn" + text + "n");Console.WriteLine("No. of matches: " + matches.Count);foreach (Match nextMatch in matches)int Index = nextMatch.Index;string result = nextMatch.ToString();int charsBefore = (Index < 5) ? Index : 5;int fromEnd = text.Length - Index - result.Lengt
24、h;int charsAfter = (fromEnd < 5) ? fromEnd : 5;int charsToDisplay = charsBefore + charsAfter + result.Length;Console.WriteLine("Index: 0, tString: 1, t2",Index, result, text.Substring(Index - charsBefore, charsToDisplay); 在這個方法中,處理過程是確定在較長的字符串中有多少個字符可以顯示,而無需超限輸入文本的開頭或結(jié)尾。注意在Match對象上使用了另一
25、個屬性Value,它包含標(biāo)識該匹配的字符串,而且,RegularExpressionsZzy只包含名為Find_po,F(xiàn)ind_n等的方法,這些方法根據(jù)本文執(zhí)行某些搜索操作。4.3 正則表達式選項可以使用影響匹配行為的選項修改正則表達式模式。可以通過兩種基本方法設(shè)置正則表達式選項:其一是可以在 Regex(pattern, options) 構(gòu)造函數(shù)中的 options 參數(shù)中指定,其中 options 是 RegexOptions 枚舉值的按位"或"組合;其二是使用內(nèi)聯(lián) (?imnsx-imnsx:) 分組構(gòu)造或 (?imnsx-imnsx) 其他構(gòu)造在正則表達式模式內(nèi)設(shè)
26、置它們。在內(nèi)聯(lián)選項構(gòu)造中,一個選項或一組選項前面的減號 (-) 用于關(guān)閉這些選項。例如,內(nèi)聯(lián)構(gòu)造 (?ix-ms) 將打開 IgnoreCase 和 IgnorePatternWhiteSpace 選項而關(guān)閉 Multiline 和 Singleline 選項。表2:RegexOptions 枚舉的成員以及等效的內(nèi)聯(lián)選項字符RegexOption 成員 內(nèi)聯(lián)字符 說明 None 無 指定不設(shè)置任何選項。 IgnoreCase i 指定不區(qū)分大小寫的匹配。 Multiline m 指定多行模式。更改 和 $ 的含義,以使它們分別與任何行的開頭和結(jié)尾匹配,而不只是與整個字符串的開頭和結(jié)尾匹配。 E
27、xplicitCapture n 指定唯一有效的捕獲是顯式命名或編號的 (?<name>.) 形式的組。這允許圓括號充當(dāng)非捕獲組,從而避免了由 (?:.) 導(dǎo)致的語法上的笨拙。 Compiled 無 指定正則表達式將被編譯為程序集。生成該正則表達式的 Microsoft 中間語言 (MSIL) 代碼;以較長的啟動時間為代價,得到更快的執(zhí)行速度。 Singleline s 指定單行模式。更改句點字符 (.) 的含義,以使它與每個字符(而不是除 n 外的所有字符)匹配。 IgnorePatternWhitespace x 指定從模式中排除非轉(zhuǎn)義空白并啟用數(shù)字符號 (#) 后面的注釋。請
28、注意,空白永遠不會從字符類中消除。 RightToLeft 無 指定搜索是從右向左而不是從左向右進行的。具有此選項的正則表達式將移動到起始位置的左邊而不是右邊。(因此,起始位置應(yīng)指定為字符串的結(jié)尾而不是開頭。)為了避免構(gòu)造具有無限循環(huán)的正則表達式的可能性,此選項不能在中流指定。但是,(?<) 回顧后發(fā)構(gòu)造提供了可用作子表達式的類似替代物。 ECMAScript 無 指定已為表達式啟用了符合 ECMAScript 的行為。此選項僅可與 IgnoreCase 和 Multiline 標(biāo)志一起使用。將 ECMAScript 同任何其他標(biāo)志一起使用將導(dǎo)致異常。 例如,F(xiàn)ind_po在字開頭處查找
29、以"po"開頭的字符串:static void Find_po()string text = " I can not find my position in Beijing "string pattern = "bpoS*ionb"MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);Writ
30、eMatches(text, matches); 這段代碼還使用了名稱空間RegularExpressions:4.4 匹配、組和捕獲一般表達式的一個很好的特性是可以把字符組合起來,方式與C#中的復(fù)合語句一樣。在C#中,可以通過把任意數(shù)量的語句放在花括號中的方式把它們組合在一起。其結(jié)果就像一個復(fù)合語句那樣。在一般表達式模式中,也可以把任何字符組合起來(包括元字符和轉(zhuǎn)義序列),像處理一個字符那樣處理它們。唯一的區(qū)別是要使用圓括號,而不是花括號,得到的序列成為一個組。 例如,模式"(an)+"定位序列an的任以重復(fù)。量詞+只應(yīng)用于它前面的一個字符,但因為我們把字符組合起來了,所
31、以它現(xiàn)在把重復(fù)的an作為一個單元來對待。"(an)."應(yīng)用到輸入文本"bananas came to Europe late in the annals of history"上,會從bananas中選擇出anan。另一方面,如果使用an+,則將從annals中選擇ann,從bananas中選擇出兩個an。為什么(an)+選擇的是anan,而沒有把單個的an作為一個匹配。匹配規(guī)則是不能重復(fù)的,如果有可能重復(fù),在默認情況下就選擇較長的匹配。但是,組的功能要比這強大得多。在默認情況下,把模式的一部分組合為一個組時,就要求一般表達式引擎記住可以按照這個組來匹配,也可以按照整個模式來匹配。換言之,可以把組當(dāng)作一個要匹配的模式,如果要把字符串分解為各個部分,這種模式就是非常有效的。 例如,URI的格式是"<protocol>:/<address>:<port>",其中端口是可選的。它的一個樣例是。假定要從一個URI中提取協(xié)議、地址和端口,而且緊鄰URI的后面可能有空白(但沒有標(biāo)點符號),就可以使用下面的表達式:"b(S+):/(S+)(?:(S+)?b"該表達式的工作方式如下:首先,前
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題開題報告:道德與法治課教師“六要”素質(zhì)及提升路徑研究
- 課題開題報告:大思政背景下大學(xué)生職業(yè)生涯發(fā)展與就業(yè)指導(dǎo)課程體系研究
- 課題開題報告:產(chǎn)教融合促進高層次人才培養(yǎng)的路徑措施、機制模式、實踐創(chuàng)新研究
- 外貿(mào)代理承包協(xié)議
- 醫(yī)用橡膠肛門管行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 呼吸系統(tǒng)內(nèi)服藥品智能生產(chǎn)設(shè)備行業(yè)跨境出海戰(zhàn)略研究報告
- 養(yǎng)生藥膳配送服務(wù)企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 分子診斷儀器租賃服務(wù)企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 酒精膠企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 養(yǎng)生功法教學(xué)平臺行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 管理學(xué)原理(南大馬工程)
- 高考必知的自然科學(xué)類基礎(chǔ)知識考試題庫(400題)
- 設(shè)計思維電子課件
- 建筑施工企業(yè)安全生產(chǎn)風(fēng)險分級管控體系-實施指南
- 配位鍵和配位化合物課件
- 國際貨物運輸與保險課后習(xí)題參考答案
- 房地產(chǎn)銷售培訓(xùn)PPT培訓(xùn)課件
- 職業(yè)暴露(銳器傷)應(yīng)急預(yù)案演練腳本
- 建筑設(shè)計電梯計算
- 軌道交通云平臺業(yè)務(wù)關(guān)鍵技術(shù)發(fā)展趨勢
- 打造金融級智能中臺的數(shù)據(jù)底座
評論
0/150
提交評論