正則表達式(regular expression)是用來快速高效地處理文本數據的工具被處理的文本可以小到一個電子郵件地址也可以大到一個多行文本輸入框中的文本數據正則表達式不僅可用來確認一段文本是否與一個預定義的模式相匹配還可以用於從文本中抽取符合某一模式的數據
正則表達式可以被看成是一個強大的通配符(通用匹配符號)大多數人都應該很熟悉通配符例如當我們看到一個諸如SAMS的表達式那麼一個文本串中任何以SAMS開頭的字符串都可以與這個表達式匹配正則表達式提供了比這種通配符能力更強控制規則更復雜功能更完善的匹配機制
本文將對NET框架提供的支持正則表達式的類做一個概要介紹要想獲得有關正則表達式的更多知識可參考《Regular Expression Pocket Reference 》(OReilly Media出版社ISBNX)或《Mastering Regular Expressions》nd Edition (OReilly Media出版社ISBN)等書籍它們可以教會你如何創建正則表達式並提供了最常用的正則表達式列表
輸入確認
正則表達式最重要的用途之一是確認某個輸入的文本是否符合一個預定義的格式例如一個能夠作為密碼的字符串通常要遵循某些強制的規則以使得密碼字符串難以被破解這些規則常常被定義為正則表達式正則表達式也常常用來對一些簡單的輸入執行確認如確認email地址和電話號碼
RegEx類是NET框架中一個處理正則表達式的關鍵類RegEx類包含了一個名為IsMatch的靜態方法它返回一個布爾值這個布爾值說明指定的輸入串是否與一個給定的正則表達式匹配
下面的代碼中用到了一個常用的正則表達式用來測試一個email地址是否有效
string emailPattern =
@^([\w\]+)@((\[[]{}\[]{}\[]{}\)||[ccc]
(([\w]+\)+))([azAZ]{}||[]{})(\]?)$;
ConsoleWrite(Enter an email address:);
string emailInput = ConsoleReadLine();
bool match = RegexIsMatch(emailInput emailPattern);
if (match)
ConsoleWriteLine(Email address is valid);
else
ConsoleWriteLine(Supplied input is not a valid email address);
不要擔心上面的正則表達式是否有意義電子郵件模式背後隱藏的基本思想是它必須包含一些字符然後是一個@標記接著是跟在之後的一些字符組合之後至少要有兩個字符你可以試著在上面的程序段中使用不同的文本作為輸入並觀察程序執行的結果即使你不理解正則表達式本身的含義也沒有關系只要知道存在正則表達式這樣一種工具並且它可以用來對輸入進行確認這對於你編寫應用程序將是極有幫助的
從輸入中抽取數據
正則表達式另一個常見用途是用來分析文本並從用戶的輸入中抽取數據(稱為組匹配)
C#中的正則表達式包含了一個稱為組(group)的獨特特征使用組可以為正則表達式中特定的段賦予一個標識符名稱當調用match()方法對模式和輸入數據進行比較時比較的結果實際上是按照組拆分被匹配的符號串這樣就允許你從輸入中抽取與每個組相匹配的部分
例如我們可以在前一個例子中創建一個名為username的組用它從一個email地址中提取所有位於@之前的符號串這樣在執行匹配時就可以應用正則表達式中的命名組來抽取用戶名信息
看看下面的代碼示例它說明如何從用戶在控制台輸出的URL地址中同時抽取協議名和端口號正則表達式的一個良好特性是它自身構成了一個語言這個語言與CC++C#或任何其他編程語言沒有依賴關系這使得我們可以容易地從互聯網或參考文獻的應用案例中借用某些常用的正則表達式例如下面例程中的正則表達式借用自MSDN中的一個例子
string urlPattern = @^(?
\w+)://[^/]+?(?
:\d+)?/;
ConsoleWriteLine();
ConsoleWrite(Enter a URL for data parsing: );
string url = ConsoleReadLine();
Regex urlExpression = new Regex(urlPattern RegexOptionsCompiled);
Match urlMatch = urlExpressionMatch(url);
ConsoleWriteLine(The Protocol you entered was +
urlMatchGroups[proto]Value);
ConsoleWriteLine(The Port Number you entered was +
urlMatchGroups[port]Value);
運行上面的例程時如果為它輸入一個沒有端口號的URL你將會注意到程序不輸入任何組的匹配值這是因為輸入的文本與正則表達式根本不匹配當輸入與正則表達式不匹配時顯然就不能夠利用任何命名的組來抽取有意義的數據如果為上面的例程輸入一個帶端口號並且與正則表達式匹配的URL程序產生的輸出將如下所示
Enter a URL for data parsing: x
The Protocol you entered was http
The Port Number you entered was :
From:http://tw.wingwit.com/Article/program/net/201311/13539.html