正規表示式(regular expression)是用來快速、高效地處理文字資料的工具。被處理的文字可以小到乙個電子郵件位址,也可以大到乙個多行文字輸入框中的文字資料。正規表示式不僅可用來確認一段文字是否與乙個預定義的模式相匹配,還可以用於從文字中抽取符合某一模式的資料。
正規表示式可以被看成是乙個強大的萬用字元(通用匹配符號)。大多數人都應該很熟悉萬用字元,例如,當我們看到乙個諸如「sams」的表示式,那麼乙個文字串中任何以sams開頭的字串都可以與這個表示式匹配。正規表示式提供了比這種萬用字元能力更強、控制規則更複雜、功能更完善的匹配機制。
本文將對.net框架提供的支援正規表示式的類做乙個概要介紹。要想獲得有關正規表示式的更多知識,可參考《regular expression pocket reference 》(o』reilly media出版社,isbn:059600415x)或《mastering regular expressions》,2nd edition (o』reilly media出版社,isbn:0596002890)等書籍。它們可以教會你如何建立正規表示式,並提供了最常用的正規表示式列表。
輸入確認
正規表示式最重要的用途之一,是確認某個輸入的文字是否符合乙個預定義的格式。例如,乙個能夠作為密碼的字串通常要遵循某些強制的規則,以使得密碼字串難以被破解。這些規則常常被定義為正規表示式。正規表示式也常常用來對一些簡單的輸入執行確認,如確認email位址和**號碼。
regex類是.net框架中乙個處理正規表示式的關鍵類。regex類包含了乙個名為i**atch的靜態方法,它返回乙個布林值,這個布林值說明指定的輸入串是否與乙個給定的正規表示式匹配。
string emailpattern =
@"^([/w-/.]+)@((/[[0-9]/.[0-9]/.[0-9]/.)||[ccc]
(([/w-]+/.)+))([a-za-z]||[0-9])(/]?)$";
console.write("enter an e-mail address:");
string emailinput = console.readline();
bool match = regex.i**atch(emailinput, emailpattern);
if (match)
console.writeline("e-mail address is valid.");
else
console.writeline("supplied input is not a valid e-mail address.");
不要擔心上面的正規表示式是否有意義。電子郵件模式背後隱藏的基本思想是,它必須包含一些字元,然後是乙個@標記,接著是跟在「.」之後的一些字元組合,「.」之後至少要有兩個字元。你可以試著在上面的程式段中使用不同的文字作為輸入,並觀察程式執行的結果。即使你不理解正規表示式本身的含義,也沒有關係。只要知道存在正規表示式這樣一種工具,並且它可以用來對輸入進行確認,這對於你編寫應用程式將是極有幫助的。
從輸入中抽取資料
正規表示式另乙個常見用途是用來分析文字,並從使用者的輸入中抽取資料(稱為組匹配)。
c#中的正規表示式包含了乙個稱為組(group)的獨特特徵。使用組,可以為正規表示式中特定的段賦予乙個識別符號名稱。當呼叫match() 方法對模式和輸入資料進行比較時,比較的結果實際上是按照組拆分被匹配的符號串,這樣就允許你從輸入中抽取與每個組相匹配的部分。
例如,我們可以在前乙個例子中建立乙個名為username的組,用它從乙個email位址中提取所有位於@之前的符號串。這樣,在執行匹配時,就可以應用正規表示式中的命名組來抽取使用者名稱資訊。
看看下面的**示例,它說明如何從使用者在控制台輸出的url位址中同時抽取協議名和埠號。正規表示式的乙個良好特性是它自身構成了乙個語言,這個語言與c、c++、c#或任何其他程式語言沒有依賴關係。這使得我們可以容易地從網際網路或參考文獻的應用案例中借用某些常用的正規表示式。例如,下面例程中的正規表示式借用自msdn中的乙個例子:
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);
執行上面的例程時,如果為它輸入乙個沒有埠號的url,你將會注意到程式不輸入任何組的匹配值。這是因為輸入的文字與正規表示式根本不匹配。當輸入與正規表示式不匹配時,顯然就不能夠利用任何命名的組來抽取有意義的資料。如果為上面的例程輸入乙個帶埠號並且與正規表示式匹配的url,程式產生的輸出將如下所示:
Visual C 2005使用入門
功能強大的visual studio 2005 ide龐大的開發環境和n多的配置設定,學習起來還不是很簡單。c cli通過對iso c 標準的純粹擴充套件和新語法,不像傳統的ms dos 控制台程式,所以對於新手,首先應弄明白怎樣在visual studio 2005開發環境下編譯常規控制台應用程式...
Visual C 2005使用入門
功能強大的visual studio 2005 ide龐大的開發環境和n多的配置設定,學習起來還不是很簡單。c cli通過對iso c 標準的純粹擴充套件和新語法,不像傳統的ms dos 控制台程式,所以對於新手,首先應弄明白怎樣在visual studio 2005開發環境下編譯常規控制台應用程式...
Visual C 2005中使用正規表示式
正規表示式 regular expression 是用來快速 高效地處理文字資料的工具。被處理的文字可以小到乙個電子郵件位址,也可以大到乙個多行文字輸入框中的文字資料。正規表示式不僅可用來確認一段文字是否與乙個預定義的模式相匹配,還可以用於從文字中抽取符合某一模式的資料。正規表示式可以被看成是乙個強...