C#使用正則表達(dá)式實(shí)例
更新時(shí)間:2008年04月06日 22:45:32 作者:
正則表達(dá)式(regular expression)是用來(lái)快速、高效地處理文本數(shù)據(jù)的工具。被處理的文本可以小到一個(gè)電子郵件地址,也可以大到一個(gè)多行文本輸入框中的文本數(shù)據(jù)。正則表達(dá)式不僅可用來(lái)確認(rèn)一段文本是否與一個(gè)預(yù)定義的模式相匹配,還可以用于從文本中抽取符合某一模式的數(shù)據(jù)。
正則表達(dá)式可以被看成是一個(gè)強(qiáng)大的通配符(通用匹配符號(hào))。大多數(shù)人都應(yīng)該很熟悉通配符,例如,當(dāng)我們看到一個(gè)諸如“SAMS”的表達(dá)式,那么一個(gè)文本串中任何以SAMS開(kāi)頭的字符串都可以與這個(gè)表達(dá)式匹配。正則表達(dá)式提供了比這種通配符能力更強(qiáng)、控制規(guī)則更復(fù)雜、功能更完善的匹配機(jī)制。
本文將對(duì).NET框架提供的支持正則表達(dá)式的類做一個(gè)概要介紹。要想獲得有關(guān)正則表達(dá)式的更多知識(shí),可參考《Regular Expression Pocket Reference 》(O'Reilly Media出版社,ISBN:059600415X)或《Mastering Regular Expressions》,2nd Edition (O'Reilly Media出版社,ISBN:0596002890)等書籍。它們可以教會(huì)你如何創(chuàng)建正則表達(dá)式,并提供了最常用的正則表達(dá)式列表。
輸入確認(rèn)
正則表達(dá)式最重要的用途之一,是確認(rèn)某個(gè)輸入的文本是否符合一個(gè)預(yù)定義的格式。例如,一個(gè)能夠作為密碼的字符串通常要遵循某些強(qiáng)制的規(guī)則,以使得密碼字符串難以被破解。這些規(guī)則常常被定義為正則表達(dá)式。正則表達(dá)式也常常用來(lái)對(duì)一些簡(jiǎn)單的輸入執(zhí)行確認(rèn),如確認(rèn)email地址和電話號(hào)碼。
RegEx類是.NET框架中一個(gè)處理正則表達(dá)式的關(guān)鍵類。RegEx類包含了一個(gè)名為IsMatch的靜態(tài)方法,它返回一個(gè)布爾值,這個(gè)布爾值說(shuō)明指定的輸入串是否與一個(gè)給定的正則表達(dá)式匹配。
下面的代碼中,用到了一個(gè)常用的正則表達(dá)式,用來(lái)測(cè)試一個(gè)email地址是否有效:
string emailPattern =
@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)||[ccc]
(([\w-]+\.)+))([a-zA-Z]{2,4}||[0-9]{1,3})(\]?)$";
Console.Write("Enter an e-mail address:");
string emailInput = Console.ReadLine();
bool match = Regex.IsMatch(emailInput, emailPattern);
if (match)
Console.WriteLine("E-mail address is valid.");
else
Console.WriteLine("Supplied input is not a valid e-mail address.");
不要擔(dān)心上面的正則表達(dá)式是否有意義。電子郵件模式背后隱藏的基本思想是,它必須包含一些字符,然后是一個(gè)@標(biāo)記,接著是跟在“.”之后的一些字符組合,“.”之后至少要有兩個(gè)字符。你可以試著在上面的程序段中使用不同的文本作為輸入,并觀察程序執(zhí)行的結(jié)果。即使你不理解正則表達(dá)式本身的含義,也沒(méi)有關(guān)系。只要知道存在正則表達(dá)式這樣一種工具,并且它可以用來(lái)對(duì)輸入進(jìn)行確認(rèn),這對(duì)于你編寫應(yīng)用程序?qū)⑹菢O有幫助的。
從輸入中抽取數(shù)據(jù)
正則表達(dá)式另一個(gè)常見(jiàn)用途是用來(lái)分析文本,并從用戶的輸入中抽取數(shù)據(jù)(稱為組匹配)。
C#中的正則表達(dá)式包含了一個(gè)稱為組(group)的獨(dú)特特征。使用組,可以為正則表達(dá)式中特定的段賦予一個(gè)標(biāo)識(shí)符名稱。當(dāng)調(diào)用match() 方法對(duì)模式和輸入數(shù)據(jù)進(jìn)行比較時(shí),比較的結(jié)果實(shí)際上是按照組拆分被匹配的符號(hào)串,這樣就允許你從輸入中抽取與每個(gè)組相匹配的部分。
例如,我們可以在前一個(gè)例子中創(chuàng)建一個(gè)名為username的組,用它從一個(gè)email地址中提取所有位于@之前的符號(hào)串。這樣,在執(zhí)行匹配時(shí),就可以應(yīng)用正則表達(dá)式中的命名組來(lái)抽取用戶名信息。
看看下面的代碼示例,它說(shuō)明如何從用戶在控制臺(tái)輸出的URL地址中同時(shí)抽取協(xié)議名和端口號(hào)。正則表達(dá)式的一個(gè)良好特性是它自身構(gòu)成了一個(gè)語(yǔ)言,這個(gè)語(yǔ)言與C、C++、C#或任何其他編程語(yǔ)言沒(méi)有依賴關(guān)系。這使得我們可以容易地從互聯(lián)網(wǎng)或參考文獻(xiàn)的應(yīng)用案例中借用某些常用的正則表達(dá)式。例如,下面例程中的正則表達(dá)式借用自MSDN中的一個(gè)例子:
string urlPattern = @"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/";
Console.WriteLine();
Console.Write("Enter a URL for data parsing: ");
string url = Console.ReadLine();
Regex urlExpression = new Regex(urlPattern, RegexOptions.Compiled);
Match urlMatch = urlExpression.Match(url);
Console.WriteLine("The Protocol you entered was " +
urlMatch.Groups["proto"].Value);
Console.WriteLine("The Port Number you entered was " +
urlMatch.Groups["port"].Value);
運(yùn)行上面的例程時(shí),如果為它輸入一個(gè)沒(méi)有端口號(hào)的URL,你將會(huì)注意到程序不輸入任何組的匹配值。這是因?yàn)檩斎氲奈谋九c正則表達(dá)式根本不匹配。當(dāng)輸入與正則表達(dá)式不匹配時(shí),顯然就不能夠利用任何命名的組來(lái)抽取有意義的數(shù)據(jù)。如果為上面的例程輸入一個(gè)帶端口號(hào)并且與正則表達(dá)式匹配的URL,程序產(chǎn)生的輸出將如下所示:
Enter a URL for data parsing: http://server.com:2100/home.aspx
The Protocol you entered was http
The Port Number you entered was :2100
相關(guān)文章
.Net結(jié)構(gòu)型設(shè)計(jì)模式之裝飾模式(Decorator)
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之裝飾模式(Decorator),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05ASP.NET MVC中_ViewStart.cshtml作用介紹
這篇文章介紹了ASP.NET MVC中_ViewStart.cshtml的作用,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03asp.net下SQLite(輕量級(jí)最佳數(shù)據(jù)庫(kù)) 原理分析和開(kāi)發(fā)應(yīng)用
SQLite是一個(gè)開(kāi)源的嵌入式關(guān)系數(shù)據(jù)庫(kù),它在2000年由D. Richard Hipp發(fā)布,它的減少應(yīng)用程序管理數(shù)據(jù)的開(kāi)銷,SQLite可移植性好,很容易使用,很小,高效而且可靠2011-10-10三種方法解決ASP.NET?Core?6中的依賴項(xiàng)
這篇文章主要介紹了解決ASP.NET?Core?6依賴項(xiàng)的三種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-11-11IIS7 應(yīng)用程序池的 托管管道模式與集成模式小結(jié)
而 IIS 7 完全整合 .NET 之后,架構(gòu)的處理順序有了很大的不同(如下圖),最主要的原因就是 ASP.NET 從 IIS 插件(ISAPI extension)的角色,進(jìn)入了 IIS 核心,而且也能以 ASP.NET 模塊負(fù)責(zé)處理 IIS 7 的諸多類型要求。2011-02-02