C 中的正規表示式介紹

2022-10-07 12:18:09 字數 3716 閱讀 6101

正規表示式的全面模式匹配表示法可以快速地分析大量的文字以找到特定的字元模式;提取、編輯、替換或刪除文字子字串;或將提取的字串新增到集合以生成報告。

1、正規表示式簡介

正規表示式提供了功能強大、靈活而又高效的方法來處理文字。正規表示式的全面模式匹配表示法可以快速地分析大量的文字以找到特定的字元模式;提取、編輯、替換或刪除文字子字串;或將提取的字串新增到集合以生成報告。對於處理字串(例如 html處理、日誌檔案分析和 http 標頭分析)的許多應用程式而言,正規表示式是不可缺少的工具。

.net 框架正規表示式併入了其他正規表示式實現的最常見功能,被設計為與 perl 5 正規表示式相容,.net 框架正規表示式還包括一些在其他實現中尚未提供的功能,.net 框架正規表示式類是基類庫的一部分,並且可以和面向公共語言執行庫的任何語言或工具一起使用。

2、字串搜尋

正規表示式語言由兩種基本字元型別組成:原義(正常)文字字元和元字元。正是元字元組為正規表示式提供了處理能力。當前,所有的文字編輯器都有一些搜尋功能,通常可以開啟乙個對話方塊,在其中的乙個文字框中鍵入要定位的字串,如果還要同時進行替換操作,可以鍵入乙個替換字串,比如在windows作業系統中的記事本、office系列中的文件編輯器都有這種功能。

這種搜尋最簡單的方式,這類問題很容易用string類的string.replace()方法來解決,但如果需要在文件中識別某個重複的,該怎麼辦?

編寫乙個例程,從乙個string類中選擇重複的字是比較複雜的,此時使用語言就很適合。

一般表示式語言是一種可以編寫搜尋表示式的語言。在該語言中,可以把文件中要搜尋的文字、轉義序列和特定含義的其他字元組合在一起,例如序列b表示乙個字的開頭和結尾(子的邊界),如果要表示正在查詢的以字元th開頭的字,就可以編寫一般表示式bth(即序列字元界是-t-h)。如果要搜尋所有以th結尾的字,就可以編寫thb(序列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。下面**示www.cppcns.com例演示了如何將集合複製到乙個字串陣列(保留每一匹配)和乙個整數陣列(指示每一匹配的位置)中。

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 和 lengts**zgh 分別分配給找到每一字串的初始字串中的字元位置,以及每一字串的長度。

regex r;

match m;

capturecollection cc;

int posn, length;

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

m = r.match("bcabcabc");

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

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

希望通過本文對正規表示式的介紹,能夠給你帶來幫助。

本文標題: c#中的正規表示式介紹

本文位址:

正規表示式介紹

一 前言 對於正規表示式,相信很多人都知道,但是很多人的第一感覺就是難學,因為看第一眼時,覺得完全沒有規律可尋,而且全是一堆各種各樣的特殊符號,完全不知所云。其實只是對正則不了解而以,了解了你就會發現,原來就這樣啊正則所用的相關字元其實不多,也不難記,更不難懂,唯一難的就是組合起來之後,可讀性比較差...

正規表示式 介紹

表示式全集 字元 描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的...

正規表示式介紹

正規表示式是一種文字模式,包括普通字元和特殊字元 元字元 正規表示式 使用單個字串來描述 匹配一系列符合某個句法規則的字串 xyz 負值字元集合,匹配集合中不包含的任意一字元,如 ace 可以匹配 play 中的 p l y a f 1 6 字元範圍,匹配指定範圍內的任意一字元.注意 b匹配乙個單詞...