詳解C 正規表示式

2021-09-30 08:05:31 字數 2691 閱讀 1003

c#正規表示式允許快速有效地處理文字。被處理的文字小到乙個電子郵件位址,大到乙個多行的輸入框內容。c#正規表示式的使用不僅允許你使用乙個定義模式來校驗文字,而且還允許你從匹配乙個給定模式的文字中提取資料。

你可以把乙個正規表示式當作是一種特別強有力的萬用字元。當我們看到象"sams*"這樣的表示式時,我們都會熟悉萬用字元,任何以單詞sams開頭的內容都是乙個匹配的表示式。正規表示式能為你提供遠遠超過萬用字元的強有力的控制功能。

本節先向你簡短地介紹一下.net框架中提供的支援使用c#正規表示式的類。有關正規表示式的更多資訊,你可以參考《正規表示式快速參考手冊》或《精通正規表示式》的第二版。這些書將提供給你需要的資訊以便建立你自己的正規表示式,而且還提供了常用正規表示式的一組列表。至於正規表示式本身已經超出本文的討論範圍。

一.校驗輸入

正規表示式的一種最常用的場所是用於使用一些預先定義的格式(例如,強制建立的規則用於確保口令中包含特定的使其很難被拆斷的字元)校驗使用者輸入。這些規則被典型地定義為正規表示式。正規表示式也常用於校驗簡單的輸入,例如電子郵件位址和**號碼。

.net框架提供的操作正規表示式的乙個關鍵類是regex類。這個類提供乙個靜態的方法ismatch,它返回乙個布林值指示是否指定的輸入字串匹配乙個給定的正規表示式。

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

.ismatch(emailinput, emailpattern);  

if (match)  

console.writeline("e-mail address is valid.");  

else  

console.writeline("supplied input is not a valid e-mail address."); 

如果你搞不清楚這個正規表示式,別擔心。電子郵件模式的基本思想是,它需要一些數字字母字元,後面跟著乙個@符號,然後是一些字元組合,再後面跟著乙個".",再往後至少跟著兩個字元。你可以以不同的輸入試驗前面的**來看一下你得到什麼結果。即使你不理解該正規表示式本身,只要知道它們的存在,那麼你就可以把它使用於你的應用程式中來校驗輸入。

二.從輸入中提取資料

c#正規表示式的其它常見的用法是,根據表示式分析文字以及使用之來從使用者輸入中提取資料(稱作組匹配)。

正規表示式中包括乙個特徵叫組。乙個組允許你把乙個命名標識放到該正規表示式的乙個特定節中。當你呼叫match()來針對模式比較輸入資料時,其結果實際上把匹配分成一些組,允許你提取匹配每乙個組的輸入的部分。

例如,在前面的例子中,我們建立了乙個username,它允許我們提取在乙個電子郵件位址中位於@符號前的所有資料。然後,當執行乙個匹配時,我們能夠使用正規表示式的命名組從輸入中提取該username。

下列**顯示怎樣從乙個使用者在控制台輸入的url中提取協議名字和埠號。正規表示式的偉大在於,它們使用自己的語言;因此,它們不必依賴於c、c++、c#、vb.net或任何其它語言。在下列**中的正規表示式來自於乙個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執行前面的**時,你會注意到,你沒有得到任何組值。這是因為,該輸入根本不匹配c#正規表示式。當不存在匹配時,你顯然無法從給定的組中提取有意義的資料。當你使用匹配該正規表示式的埠號的url執行前面的**時,你將得到如下列文字所示的輸出結果:

正規表示式詳解

正規表示式 基本正規表示式主要用於grep,egrep,vi,sed,awk命令中進行字串匹配。符號 意義 c 匹配字母c 匹配任意單個字元 匹配前乙個字元出現零次或多次 匹配任意多個任意字元 匹配集合中的任意單個字元,括號中為乙個集合 x y 匹配連續的字串範圍 匹配字串的開頭 匹配字串的結尾 匹...

正規表示式詳解

正規表示式主要作用 分割 匹配 查詢 替換 正規表示式中包括的元素 1.原子 普通字元 a z a z 0 9 原子表 轉義字元 2.元字元 有特殊功能的字元 3.修正模式符 系統內建部分字元,例如 i m s u 原子 1.a z a z 0 9 最常見的字元 2.abc 用圓括號包含起來的單元符...

正規表示式詳解

正規表示式 regular expression 又稱正規表示式 規則表示式等,是電腦科學的乙個概念。正規表示式使用單個字串來描述 匹配一系列匹配某個句法規則的字串,也通常用來檢索 替換那些匹配某個模式的文字。下面從以下方面開始講述正規表示式在python中的應用。1.在python中使用,首先需要...