C#中利用正則表達式實現字符串搜索 |
作者
:
來源
:
閱讀 354 人次,2006-4-27 9:52:00 |
||||||||
關鍵字 :正則表達式、元字符、字符串、匹配 1、正則表達式簡介 正則表達式提供了功能強大、靈活而又高效的方法來處理文本。正則表達式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或將提取的字符串添加到集合以生成報告。對于處理字符串(例如 HTML 處理、日志文件分析和 HTTP 標頭分析)的許多應用程序而言,正則表達式是不可缺少的工具。 .NET 框架正則表達式并入了其他正則表達式實現的最常見功能,被設計為與 Perl 5 正則表達式兼容,.NET 框架正則表達式還包括一些在其他實現中尚未提供的功能,.NET 框架正則表達式類是基類庫的一部分,并且可以和面向公共語言運行庫的任何語言或工具一起使用。 2、字符串搜索 正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。正是元字符組為正則表達式提供了處理能力。當前,所有的文本編輯器都有一些搜索功能,通常可以打開一個對話框,在其中的一個文本框中鍵入要定位的字符串,如果還要同時進行替換操作,可以鍵入一個替換字符串,比如在Windows操作系統中的記事本、Office系列中的文檔編輯器都有這種功能。這種搜索最簡單的方式,這類問題很容易用String類的String.Replace()方法來解決,但如果需要在文檔中識別某個重復的,該怎么辦?編寫一個例程,從一個String類中選擇重復的字是比較復雜的,此時使用語言就很適合。 一般表達式語言是一種可以編寫搜索表達式的語言。在該語言中,可以把文檔中要搜索的文本、轉義序列和特定含義的其他字符組合在一起,例如序列\b表示一個字的開頭和結尾(子的邊界),如果要表示正在查找的以字符th開頭的字,就可以編寫一般表達式\bth(即序列字符界是-t-h)。如果要搜索所有以th結尾的字,就可以編寫th\b(序列t-h-字邊界)。但是,一般表達式要比這復雜得多,例如,可以在搜索操作中找到存儲部分文本的工具性程序(facility)。 3、.NET 框架的正則表達式類 下面通過介紹 .NET 框架的正則表達式類,熟悉一下.NET框架下的正則表達式的使用方法。 3.1 Regex 類表示只讀正則表達式 Regex 類包含各種靜態方法,允許在不顯式實例化其他類的對象的情況下使用其他正則表達式類。以下代碼示例創建了 Regex 類的實例并在初始化對象時定義一個簡單的正則表達式。請注意,使用了附加的反斜杠作為轉義字符,它將 \s 匹配字符類中的反斜杠指定為原義字符。
3.2 Match 類表示正則表達式匹配操作的結果 以下示例使用 Regex 類的 Match 方法返回 Match 類型的對象,以便找到輸入字符串中第一個匹配。此示例使用 Match 類的 Match.Success 屬性來指示是否已找到匹配。
3.3 MatchCollection 類表示非重疊匹配的序列 該集合為只讀的,并且沒有公共構造函數。MatchCollection 的實例是由 Regex.Matches 屬性返回的。使用 Regex 類的 Matches 方法,通過在輸入字符串中找到的所有匹配填充 MatchCollection。下面代碼示例演示了如何將集合復制到一個字符串數組(保留每一匹配)和一個整數數組(指示每一匹配的位置)中。
3.4 GroupCollection 類表示捕獲的組的集合 該集合為只讀的,并且沒有公共構造函數。GroupCollection 的實例在 Match.Groups 屬性返回的集合中返回。下面的控制臺應用程序查找并輸出由正則表達式捕獲的組的數目。
該示例產生下面的輸出:
3.5 CaptureCollection 類表示捕獲的子字符串的序列 由于限定符,捕獲組可以在單個匹配中捕獲多個字符串。Captures屬性(CaptureCollection 類的對象)是作為 Match 和 group 類的成員提供的,以便于對捕獲的子字符串的集合的訪問。例如,如果使用正則表達式 ((a(b))c)+(其中 + 限定符指定一個或多個匹配)從字符串"abcabcabc"中捕獲匹配,則子字符串的每一匹配的 Group 的 CaptureCollection 將包含三個成員。 下面的程序使用正則表達式 (Abc)+來查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一個或多個匹配,闡釋了使用 Captures 屬性來返回多組捕獲的子字符串。
此例返回下面的輸出結果:
3.6 Capture 類包含來自單個子表達式捕獲的結果 在 Group 集合中循環,從 Group 的每一成員中提取 Capture 集合,并且將變量 posn 和 length 分別分配給找到每一字符串的初始字符串中的字符位置,以及每一字符串的長度。
把組合字符組合起來后,每次都會返回一個組對象,就可能并不是我們希望的結果。如果希望把組合字符作為搜索模式的一部分,就會有相當大的系統開銷。對于單個的組,可以用以字符序列"?:"開頭的組禁止這么做,就像URI樣例那樣。而對于所有的組,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture標志。 |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
