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

首頁(yè) > 編程 > C# > 正文

C#中的正則表達(dá)式介紹

2020-01-24 01:24:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

正則表達(dá)式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或?qū)⑻崛〉淖址砑拥郊弦陨蓤?bào)告。
1、正則表達(dá)式簡(jiǎn)介

正則表達(dá)式提供了功能強(qiáng)大、靈活而又高效的方法來(lái)處理文本。正則表達(dá)式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或?qū)⑻崛〉淖址砑拥郊弦陨蓤?bào)告。對(duì)于處理字符串(例如 HTML處理、日志文件分析和 HTTP 標(biāo)頭分析)的許多應(yīng)用程序而言,正則表達(dá)式是不可缺少的工具。

.NET 框架正則表達(dá)式并入了其他正則表達(dá)式實(shí)現(xiàn)的最常見功能,被設(shè)計(jì)為與 Perl 5 正則表達(dá)式兼容,.NET 框架正則表達(dá)式還包括一些在其他實(shí)現(xiàn)中尚未提供的功能,.NET 框架正則表達(dá)式類是基類庫(kù)的一部分,并且可以和面向公共語(yǔ)言運(yùn)行庫(kù)的任何語(yǔ)言或工具一起使用。

2、字符串搜索

正則表達(dá)式語(yǔ)言由兩種基本字符類型組成:原義(正常)文本字符和元字符。正是元字符組為正則表達(dá)式提供了處理能力。當(dāng)前,所有的文本編輯器都有一些搜索功能,通常可以打開一個(gè)對(duì)話框,在其中的一個(gè)文本框中鍵入要定位的字符串,如果還要同時(shí)進(jìn)行替換操作,可以鍵入一個(gè)替換字符串,比如在Windows操作系統(tǒng)中的記事本、Office系列中的文檔編輯器都有這種功能。

這種搜索最簡(jiǎn)單的方式,這類問(wèn)題很容易用String類的String.Replace()方法來(lái)解決,但如果需要在文檔中識(shí)別某個(gè)重復(fù)的,該怎么辦?

編寫一個(gè)例程,從一個(gè)String類中選擇重復(fù)的字是比較復(fù)雜的,此時(shí)使用語(yǔ)言就很適合。

一般表達(dá)式語(yǔ)言是一種可以編寫搜索表達(dá)式的語(yǔ)言。在該語(yǔ)言中,可以把文檔中要搜索的文本、轉(zhuǎn)義序列和特定含義的其他字符組合在一起,例如序列b表示一個(gè)字的開頭和結(jié)尾(子的邊界),如果要表示正在查找的以字符th開頭的字,就可以編寫一般表達(dá)式bth(即序列字符界是-t-h)。如果要搜索所有以th結(jié)尾的字,就可以編寫thb(序列t-h-字邊界)。但是,一般表達(dá)式要比這復(fù)雜得多,例如,可以在搜索操作中找到存儲(chǔ)部分文本的工具性程序(facility)。

3、.NET 框架的正則表達(dá)式類

下面通過(guò)介紹 .NET 框架的正則表達(dá)式類,熟悉一下.NET框架下的正則表達(dá)式的使用方法。

3.1 Regex 類表示只讀正則表達(dá)式

Regex 類包含各種靜態(tài)方法,允許在不顯式實(shí)例化其他類的對(duì)象的情況下使用其他正則表達(dá)式類。以下代碼示例創(chuàng)建了 Regex 類的實(shí)例并在初始化對(duì)象時(shí)定義一個(gè)簡(jiǎn)單的正則表達(dá)式。請(qǐng)注意,使用了附加的反斜杠作為轉(zhuǎn)義字符,它將 s 匹配字符類中的反斜杠指定為原義字符。

Regex r; // 聲明一個(gè) Regex類的變量 r = new Regex("/s2000"); // 定義表達(dá)式 

3.2 Match 類表示正則表達(dá)式匹配操作的結(jié)果

以下示例使用 Regex 類的 Match 方法返回 Match 類型的對(duì)象,以便找到輸入字符串中第一個(gè)匹配。此示例使用 Match 類的 Match.Success 屬性來(lái)指示是否已找到匹配。

Regex r = new Regex("abc"); // 定義一個(gè)Regex對(duì)象實(shí)例 Match m = r.Match("123abc456"); // 在字符串中匹配 if (m.Success) { Console.WriteLine("Found match at position " + m.Index); //輸入匹配字符的位置 } 

3.3 MatchCollection 類表示非重疊匹配的序列

該集合為只讀的,并且沒有公共構(gòu)造函數(shù)。MatchCollection 的實(shí)例是由 Regex.Matches 屬性返回的。使用 Regex 類的 Matches 方法,通過(guò)在輸入字符串中找到的所有匹配填充 MatchCollection。下面代碼示例演示了如何將集合復(fù)制到一個(gè)字符串?dāng)?shù)組(保留每一匹配)和一個(gè)整數(shù)數(shù)組(指示每一匹配的位置)中。

MatchCollection mc; String[] results = new String[20]; int[] matchposition = new int[20]; Regex r = new Regex("abc"); //定義一個(gè)Regex對(duì)象實(shí)例 mc = r.Matches("123abc4abcd"); for (int i = 0; i < mc.Count; i++) //在輸入字符串中找到所有匹配 { results = mc.Value; //將匹配的字符串添在字符串?dāng)?shù)組中 matchposition = mc.Index; //記錄匹配字符的位置 } 

3.4 GroupCollection 類表示捕獲的組的集合

該集合為只讀的,并且沒有公共構(gòu)造函數(shù)。GroupCollection 的實(shí)例在 Match.Groups 屬性返回的集合中返回。下面的控制臺(tái)應(yīng)用程序查找并輸出由正則表達(dá)式捕獲的組的數(shù)目。

using System; using System.Text.RegularExpressions; public class RegexTest { public static void RunTest() { Regex r = new Regex("(a(b))c"); //定義組 Match m = r.Match("abdabc"); Console.WriteLine("Number of groups found = " + m.Groups.Count); } public static void Main() { RunTest(); } } 

該示例產(chǎn)生下面的輸出:

Number of groups found = 3

3.5 CaptureCollection 類表示捕獲的子字符串的序列

由于限定符,捕獲組可以在單個(gè)匹配中捕獲多個(gè)字符串。Captures屬性(CaptureCollection 類的對(duì)象)是作為 Match 和 group 類的成員提供的,以便于對(duì)捕獲的子字符串的集合的訪問(wèn)。例如,如果使用正則表達(dá)式 ((a(b))c)+(其中 + 限定符指定一個(gè)或多個(gè)匹配)從字符串"abcabcabc"中捕獲匹配,則子字符串的每一匹配的 Group 的 CaptureCollection 將包含三個(gè)成員。

下面的程序使用正則表達(dá)式 (Abc)+來(lái)查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一個(gè)或多個(gè)匹配,闡釋了使用 Captures 屬性來(lái)返回多組捕獲的子字符串。

using System; using System.Text.RegularExpressions; public class RegexTest { public static void RunTest() { int counter; Match m; CaptureCollection cc; GroupCollection gc; Regex r = new Regex("(Abc)+"); //查找"Abc" m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //設(shè)定要查找的字符串 gc = m.Groups; //輸出查找組的數(shù)目 Console.WriteLine("Captured groups = " + gc.Count.ToString()); // Loop through each group. for (int i=0; i < gc.Count; i++) //查找每一個(gè)組 { cc = gc.Captures; counter = cc.Count; Console.WriteLine("Captures count = " + counter.ToString()); for (int ii = 0; ii < counter; ii++) { // Print capture and position. Console.WriteLine(cc[ii] + " Starts at character " + cc[ii].Index); //輸入捕獲位置 } } } public static void Main() { RunTest(); } } 

此例返回下面的輸出結(jié)果:

Captured groups = 2 Captures count = 1 AbcAbcAbc Starts at character 3 Captures count = 3 Abc Starts at character 3 Abc Starts at character 6 Abc Starts at character 9 

3.6 Capture 類包含來(lái)自單個(gè)子表達(dá)式捕獲的結(jié)果

在 Group 集合中循環(huán),從 Group 的每一成員中提取 Capture 集合,并且將變量 posn 和 length 分別分配給找到每一字符串的初始字符串中的字符位置,以及每一字符串的長(zhǎng)度。

Regex r; Match m; CaptureCollection cc; int posn, length; r = new Regex("(abc)*"); m = r.Match("bcabcabc"); for (int i=0; m.Groups.Value != ""; i++) { cc = m.Groups.Captures; for (int j = 0; j < cc.Count; j++) { posn = cc[j].Index; //捕獲對(duì)象位置 length = cc[j].Length; //捕獲對(duì)象長(zhǎng)度 } } 

把組合字符組合起來(lái)后,每次都會(huì)返回一個(gè)組對(duì)象,就可能并不是我們希望的結(jié)果。如果希望把組合字符作為搜索模式的一部分,就會(huì)有相當(dāng)大的系統(tǒng)開銷。對(duì)于單個(gè)的組,可以用以字符序列"?:"開頭的組禁止這么做,就像URI樣例那樣。而對(duì)于所有的組,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture標(biāo)志。

希望通過(guò)本文對(duì)正則表達(dá)式的介紹,能夠給你帶來(lái)幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 同心县| 浦江县| 福贡县| 庆城县| 金山区| 潼关县| 江西省| 西畴县| 九龙城区| 抚远县| 安徽省| 青浦区| 浮梁县| 泗阳县| 湟中县| 张家川| 晋宁县| 沛县| 大荔县| 绥滨县| 湖北省| 雅安市| 洪洞县| 麟游县| 客服| 万载县| 嘉祥县| 商城县| 静乐县| 怀仁县| 正阳县| 应用必备| 壤塘县| 城口县| 江津市| 兰溪市| 百色市| 涪陵区| 沁阳市| 辰溪县| 阳东县|