C 中利用正規表示式實現字串搜尋

2021-08-29 03:47:45 字數 3842 閱讀 9212

作者**: 

閱讀 354 人次 , 2006-4-27 9:52:00 

摘要:本文給出了在c#下利用正規表示式實現字串搜尋功能的方法,通過對.net框架下的正規表示式的研究及例項分析,總結了正規表示式的元字元、規則、選項等。

關鍵字:正規表示式、元字元、字串、匹配

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 匹配字元類中的反斜槓指定為原義字元。

regex r; // 宣告乙個 regex類的變數

r = new regex("\\s2000"); // 定義表示式

3.2 match 類表示正規表示式匹配操作的結果

以下示例使用 regex 類的 match 方法返回 match 型別的物件,以便找到輸入字串中第乙個匹配。此示例使用 match 類的 match.success 屬性來指示是否已找到匹配。

regex r = new regex("abc"); // 定義乙個regex物件例項

match m = r.match("123abc456"); // 在字串中匹配

if (m.success)

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

該集合為唯讀的,並且沒有公共建構函式。matchcollection 的例項是由 regex.matches 屬性返回的。使用 regex 類的 matches 方法,通過在輸入字串中找到的所有匹配填充 matchcollection。下面**示例演示了如何將集合複製到乙個字串陣列(保留每一匹配)和乙個整數陣列(指示每一匹配的位置)中。

matchcollection mc;

string results = new string[20];

int matchposition = new int[20];

regex r = new regex("abc"); //定義乙個regex物件例項

mc = r.matches("123abc4abcd");

for (int i = 0; i < mc.count; i++) //在輸入字串中找到所有匹配

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

該集合為唯讀的,並且沒有公共建構函式。groupcollection 的例項在 match.groups 屬性返回的集合中返回。下面的控制台應用程式查詢並輸出由正規表示式捕獲的組的數目。

using system;

using system.text.regularexpressions;

public class regextest

public static void main()

}

該示例產生下面的輸出:

number of groups found = 3

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

由於限定符,捕獲組可以在單個匹配中捕獲多個字串。captures屬性(capturecollection 類的物件)是作為 match 和 group 類的成員提供的,以便於對捕獲的子字串的集合的訪問。例如,如果使用正規表示式 ((a(b))c)+(其中 + 限定符指定乙個或多個匹配)從字串"abcabcabc"中捕獲匹配,則子字串的每一匹配的 group 的 capturecollection 將包含三個成員。

下面的程式使用正規表示式 (abc)+來查詢字串"xyzabcabcabcxyzabcab"中的乙個或多個匹配,闡釋了使用 captures 屬性來返回多組捕獲的子字串。

using system;

using system.text.regularexpressions;

public class regextest }}

public static void main()

}

此例返回下面的輸出結果:

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 類包含來自單個子表示式捕獲的結果

在 group 集合中迴圈,從 group 的每一成員中提取 capture 集合,並且將變數 posn 和 length 分別分配給找到每一字串的初始字串中的字元位置,以及每一字串的長度。

regex r;

match m;

capturecollection cc;

int posn, length;

r = new regex("(abc)*");

m = r.match("bcabcabc");

for (int i=0; m.groups[i].value != ""; i++)

}

圖1:物件關係

把組合字元組合起來後,每次都會返回乙個組物件,就可能並不是我們希望的結果。如果希望把組合字元作為搜尋模式的一部分,就會有相當大的系統開銷。對於單個的組,可以用以字串行"?:"開頭的組禁止這麼做,就像uri樣例那樣。而對於所有的組,可以在regex.matches()方法上指定regexoptions.explicitcapture標誌。

C 中利用正規表示式實現字串搜尋

關鍵字 正規表示式 元字元 字串 匹配 1 正規表示式簡介 正規表示式提供了功能強大 靈活而又高效的方法來處理文字。正規表示式的全面模式匹配表示法可以快速地分析大量的文字以找到特定的字元模式 提取 編輯 替換或刪除文字子字串 或將提取的字串新增到集合以生成報告。對於處理字串 例如 html 處理 日...

利用正規表示式驗證Email字串

public class registercheck final pattern pattern pattern.compile pattern1 final matcher mat pattern.matcher email if mat.find return tag email檢查 param...

利用正規表示式排除特定字串

1.例子,查詢不以baidu開頭的字串。正則 baidu 匹配結果就是第2行,也就是第1行被排除了 這裡使用了零寬度斷言 exp 注意,我們有乙個向前查詢的語法 也叫順序環視 exp exp 會查詢exp之前的 位置 如果將等號換成感嘆號,就變成了否定語義,也就是說查詢的位置的後面不能是exp 一般...