站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

ASP.NET 中的正則表達(dá)式

摘要:正則表達(dá)式是一種處理文本的有用工具。無(wú)論是驗(yàn)證用戶輸入、搜索字符串內(nèi)的模式、還是以各種有效方式重新設(shè)置文本格式,正則表達(dá)式都非常有用。下載本文的源代碼
引言
Microsoft®.NET Framework 對(duì)正則表達(dá)式的支持是一流的,甚至在 Microsoft® ASP.NET 中也有依賴正則表達(dá)式語(yǔ)言的控件。本文介紹了深入學(xué)習(xí)正則表達(dá)式的基礎(chǔ)知識(shí)和推薦內(nèi)容。

本文主要面向?qū)φ齽t表達(dá)式知之甚少或沒(méi)有使用經(jīng)驗(yàn),但卻熟悉 ASP.NET、可借助 .NET 編程的初學(xué)者。此外,希望本文連同 regular expression cheat sheet 成為有正則表達(dá)式使用經(jīng)驗(yàn)的開(kāi)發(fā)者的手頭參考資料或進(jìn)修資料。本文討論內(nèi)容如下:

1.

正則表達(dá)式使用歷史簡(jiǎn)介

2.

簡(jiǎn)單表達(dá)式

3.

限定符

4.

元字符

5.

字符類

6.

預(yù)定義的集合元字符

7.

表達(dá)式示例詳細(xì)內(nèi)容

8.

ASP.NET 中的驗(yàn)證

9.

正則表達(dá)式 API

10.

免費(fèi)工具

11.

高級(jí)主題概述

12.

小結(jié)和其他資源

通常,如果對(duì)本文或?qū)φ齽t表達(dá)式有疑問(wèn),請(qǐng)?jiān)L問(wèn) http://www.aspadvice.com/,通過(guò) regex mailing list 提出問(wèn)題。編寫(xiě)此文時(shí)其中已有 350 多個(gè)訂戶參與。

ASP.NET 中的正則表達(dá)式返回頁(yè)首

正則表達(dá)式使用歷史簡(jiǎn)介

正則表達(dá)式設(shè)計(jì)于五十年代,存在至今。正則表達(dá)式最初用于描述“正則集”,它們是一些神經(jīng)生理學(xué)家研究的模式。正則表達(dá)式最早由數(shù)學(xué)家 Stephen Kleene 提出,最終由 Ken Thompson 在兩種非常流行的文本實(shí)用程序 qed 和 grep 中使用。Jeffrey Friedl 在其著作“Mastering Regular Expressions (2nd edition)”中對(duì)此作了進(jìn)一步闡述。建議那些希望更多了解正則表達(dá)式理論和歷史的人看看這本書(shū)。

在最近的五十年中,正則表達(dá)式逐漸從模糊深?yuàn)W的數(shù)學(xué)概念發(fā)展為在各類工具和軟件包中應(yīng)用的主要功能。盡管數(shù)十年來(lái)很多 UNIX 工具都支持正則表達(dá)式,但僅僅是近十年來(lái),它才在大部分 Windows 開(kāi)發(fā)者工具包中得到體現(xiàn)。在 Microsoft® Visual Basic® 6 或 Microsoft® VBScript 中,即使情況理想,正則表達(dá)式仍難以使用。但隨著.NET Framework 的推行,正則表達(dá)式的支持發(fā)展到極點(diǎn),所有 Microsoft 開(kāi)發(fā)者和所有 .NET 語(yǔ)言都可以使用正則表達(dá)式。

那么,正則表達(dá)式究竟是什么呢?正則表達(dá)式是一種語(yǔ)言,它可以明確描述文本字符串中的模式。除了簡(jiǎn)單描述這些模式之外,正則表達(dá)式引擎通常可用于遍歷匹配,并使用模式作為分隔符來(lái)將字符串解析為子字符串,或以智能方式替換文本或重新設(shè)置文本格式。正則表達(dá)式為解決與文本處理有關(guān)的許多常見(jiàn)任務(wù)提供了有效而簡(jiǎn)捷的方式。

在討論正則表達(dá)式時(shí),通常以正則表達(dá)式匹配(或不匹配)的文本為基礎(chǔ)分析正則表達(dá)式。本文(以及 System.Text.RegularExpressions 類)將在正則表達(dá)式交互操作中引用 3 個(gè)參與對(duì)象:正則表達(dá)式的“模式”、“輸入”字符串和字符串內(nèi)的所有模式的“匹配”。

ASP.NET 中的正則表達(dá)式返回頁(yè)首

簡(jiǎn)單表達(dá)式

最簡(jiǎn)單的正則表達(dá)式大家都已熟悉,即文字字符串。特定的字符串可通過(guò)文字本身加以描述;像 foo 這樣的正則表達(dá)式模式可精確匹配輸入的字符串 foo。在本例中,也將匹配如下輸入:The food was quite tasty,如果希望精確匹配,這可能不是預(yù)期結(jié)果。

當(dāng)然,使用正則表達(dá)式匹配等于它自身的精確字符串是沒(méi)有價(jià)值的實(shí)現(xiàn),不能體現(xiàn)正則表達(dá)式的真正作用。假如不查找 foo,而是查找以字母 f 開(kāi)頭的所有單詞,或所有 3 個(gè)字母的單詞,那該怎么辦?目前,這超出了文字字符串的合理范圍。我們需要更加深入地研究正則表達(dá)式。下面是一個(gè)文字表達(dá)式示例及一些匹配的輸入。

模式 輸入(匹配)

foo

foofood、foot、“There’s evil afoot.”

ASP.NET 中的正則表達(dá)式返回頁(yè)首

限定符

限定符提供了一種簡(jiǎn)單方法,用于指定在模式中允許特定字符或字符集自身重復(fù)出現(xiàn)的次數(shù)。有 3 個(gè)非顯式限定符:

1.

*,描述“出現(xiàn) 0 或多次”。

2.

+,描述“出現(xiàn) 1 或多次”。

3.

?,描述“出現(xiàn) 0 或 1 次”。

限定符始終引用限定符前(左邊)的模式,通常是單個(gè)字符,除非使用括號(hào)創(chuàng)建模式組。下面是一些模式示例及匹配的輸入。

模式 輸入(匹配)

fo*

foofoe、food、fooot、“forget it”、funny、 puffy

fo+

foofoe、food、foot、“forget it”

fo?

foo、foe、food、foot、“forget it”、funny、puffy

除了指定給定模式準(zhǔn)確出現(xiàn) 0 或 1 次之外,? 字符還可強(qiáng)制模式或子模式匹配數(shù)目最少的字符(如果匹配輸入字符串中的多個(gè)字符)。

除了非顯式限定符(一般叫做限定符,但為區(qū)別于下一組,故稱非顯式限定符)之外,還有顯式限定符。在模式出現(xiàn)次數(shù)方面,限定符的概念非常模糊。使用顯式限定符則可準(zhǔn)確指定數(shù)字、范圍或數(shù)字集。顯式限定符位于所應(yīng)用的模式的后邊,這一點(diǎn)與正則限定符一樣。顯式限定符使用花括號(hào) {} 及其中的數(shù)字值表示模式出現(xiàn)次數(shù)的上下限。例如,x{5} 將準(zhǔn)確匹配 5 個(gè) x 字符 (xxxxx)。如果僅指定一個(gè)數(shù)字,則表示次數(shù)上限;如果數(shù)字后跟一個(gè)逗號(hào),如 x{5,},表示匹配任何出現(xiàn)次數(shù)大于 4 的 x 字符。下面是一些模式示例及匹配的輸入。

模式 輸入(匹配)

ab{2}c

abbc、aaabbccc

ab{,2}c

acabcabbc、aabbcc

ab{2,3}c

abbcabbbc、aabbcc、aabbbcc

ASP.NET 中的正則表達(dá)式返回頁(yè)首

元字符

在正則表達(dá)式中,有一種意義特殊的構(gòu)造,即元字符。目前已知的元字符有很多,如 *?+{} 字符。其他字符在正則表達(dá)式語(yǔ)言中都有特殊的含義。這些字符包括:$ ^ . [ ( | ) ]

.(句點(diǎn)或點(diǎn))元字符是最簡(jiǎn)單但最常用的一個(gè)字符。它可匹配任何單字符。如果要指定某些模式可包含任意組合的字符,使用句點(diǎn)非常有用,但一定要在特定長(zhǎng)度范圍內(nèi)。此外,我們知道表達(dá)式將對(duì)包含在較長(zhǎng)字符串中的所有模式進(jìn)行匹配,假如只需要精確匹配模式,又該怎么辦?這在驗(yàn)證方案中經(jīng)常出現(xiàn),例如,要確保用戶輸入的郵政編碼或電話號(hào)碼的格式正確。使用 ^ 元字符可指定字符串(或行)的開(kāi)始,使用 $ 元字符可指定字符串(或行)的結(jié)束。通過(guò)將這些字符添加到模式的開(kāi)始和結(jié)束處,可強(qiáng)制模式僅匹配精確匹配的輸入字符串。如果 ^ 元字符用在方括號(hào) [ ] 指定的字符類的開(kāi)頭,也有特殊的含義。具體內(nèi)容見(jiàn)下。

(反斜杠)元字符既可根據(jù)特殊含義“轉(zhuǎn)義”字符,也可指定預(yù)定義集合元字符的實(shí)例。同樣,具體內(nèi)容見(jiàn)下。為了在正則表達(dá)式中包括文字樣式的元字符,必須使用反斜杠進(jìn)行“轉(zhuǎn)義”。例如,如果要匹配以“c:”開(kāi)始的字符串,可使用:^c:\。注意,要使用 ^ 元字符指出字符串必須以此模式作為開(kāi)始,然后用反斜杠元字符轉(zhuǎn)義文字反斜杠。

|(管道)元字符用于交替指定,特別用于在模式中指定“此或彼”。例如,a|b 將匹配包含“a”或“b”的任何輸入內(nèi)容,這與字符類 [ab] 非常類似。

最后,括號(hào) ( ) 用于給模式分組。它允許使用限定符讓一個(gè)完整模式出現(xiàn)多次。為了便于閱讀,或分開(kāi)匹配特定的輸入部分,可能允許分析或重新設(shè)置格式。
下面列出元字符的一些使用示例。

模式 輸入(匹配) 
.
 a、b、c、1、2、3 .*
 Abc, 123, 任意字符串, 無(wú)字符時(shí)也匹配  
^c:\
 c:windows、c:\\、c:foo.txt、c: 后跟任何其他內(nèi)容 
abc$
 abc、123abc、以 abc 結(jié)束的任意字符串  
(abc){2,3}
 abcabc、abcabcabc 

ASP.NET 中的正則表達(dá)式字符類
字符類是正則表達(dá)式中的“迷你”語(yǔ)言,在方括號(hào) [ ] 中定義。最簡(jiǎn)單的字符類只不過(guò)是括號(hào)中的一個(gè)字符表,如 [aeiou]。在表達(dá)式中使用字符類時(shí),可在模式的此位置使用其中任何一個(gè)字符(但只能使用一個(gè)字符,除非使用了限定符)。請(qǐng)注意,不能使用字符類定義單詞或模式,只能定義單個(gè)字符。

要指定任何數(shù)值數(shù)字,可以使用字符類 [0123456789]。但是,由于這樣使用字符不大方便,所以要通過(guò)在括號(hào)中使用連字符 來(lái)定義字符的范圍。連字符在字符類中有特殊的含義(不是在正則表達(dá)式中,因此,準(zhǔn)確地說(shuō)它不能叫正則表達(dá)式元字符),且僅在連字符不是第一個(gè)字符時(shí),連字符才在字符類中有特殊含義。要使用連字符指定任何數(shù)值數(shù)字,可以使用 [0-9]。小寫(xiě)字母也一樣,可以使用 [a-z],大寫(xiě)字母可以使用 [A-Z]。連字符定義的范圍取決于使用的字符集。因此,字符在(例如)ASCII 或 Unicode 表中出現(xiàn)的順序確定了在范圍中包括的字符。如果需要在范圍中包括連字符,將它指定為第一個(gè)字符。例如:[-.?] 將匹配 4 個(gè)字符中任何一個(gè)字符(注意,最后的字符是個(gè)空格)。另請(qǐng)注意,正則表達(dá)式元字符在字符類中不做特殊處理,所以這些元字符不需要轉(zhuǎn)義。考慮到字符類是與其他正則表達(dá)式語(yǔ)言分開(kāi)的一種語(yǔ)言,因此字符類有自己的規(guī)則和語(yǔ)法。

如果使用字符 ^ 作為字符類的第一個(gè)字符來(lái)否定此類,也可以匹配字符類成員以外的任何字符。因此,要匹配任何非元音字符,可以使用字符類 [^aAeEiIoOuU]。注意,如果要否定連字符,應(yīng)將連字符作為字符類的第二個(gè)字符,如 [^-]。記住,^ 在字符類中的作用與它在正則表達(dá)式模式中的作用完全不同。
下面列出操作中使用的一些字符類。

模式 輸入(匹配) 
^b[aeiou]t$
 Bat、bet、bit、bot、but

^[0-9]{5}$
 11111, 12345, 99999

^c:\
 c:windows、c:\\、c:foo.txt、c: 后跟任何其他內(nèi)容

abc$
 abc、123abc、以 abc 結(jié)束的任意字符串

(abc){2,3}
 abcabc、abcabcabc

^[^-][0-9]$
 0、1、2、… (不匹配 -0、-1、 -2 等)

在 .NET Framework 的下一版中,代碼名“Whidbey”作為一種新功能被添加到字符類中,稱作字符類差 (character class subtraction)。它的主要作用是,允許從一個(gè)字符類中減去另一個(gè)字符類,可提供更可讀的方式描述某些模式。該規(guī)范可通過(guò)以下地址訪問(wèn):

http://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/

CharacterClassSubtraction.doc。它的語(yǔ)法類似 [a-z-[aeiou]],匹配所有的小寫(xiě)輔音字母。

ASP.NET 中的正則表達(dá)式返回頁(yè)首

預(yù)定義的集合元字符

使用目前提供的工具可以完成很多工作。但是,要使用 [0-9] 表示模式中的每個(gè)數(shù)值數(shù)字,或(更糟)使用 [0-9a-zA-Z]表示任何字母數(shù)字字符,還有一段相當(dāng)漫長(zhǎng)的過(guò)程。為了減輕處理這些常用但冗長(zhǎng)模式的痛苦,事先定義了預(yù)定義元字符集合。正則表達(dá)式的不同實(shí)現(xiàn)定義了不同的預(yù)定義元字符集合,下面描述的預(yù)定義元字符集合在 .NET Framework 中得到 System.Text.RegularExpressions API 的支持。這些預(yù)定義元字符的標(biāo)準(zhǔn)語(yǔ)法是,在反斜杠 后跟一個(gè)或多個(gè)字符。多數(shù)預(yù)定義元字符只有一個(gè)字符,它們的使用很容易,是冗長(zhǎng)字符類的理想替代字符。以下是兩個(gè)示例:d 匹配所有數(shù)值數(shù)字,w 匹配所有單詞字符(字母數(shù)字加下劃線)。例外情況是一些特定字符代碼匹配,此時(shí)必須指定所匹配字符的地址,如 u000D 將匹配 Unicode 回車符。下面列出一些最常用的字符類及其等效的元字符。

元字符 等效字符類

a

匹配鈴聲(警報(bào));u0007

b

匹配字符類外的字邊界,它匹配退格字符,u0008

t

匹配制表符,u0009

r

匹配回車符,u000D

w

匹配垂直制表符,u000B

f

匹配換頁(yè)符,u000C

n

匹配新行,u000A

e

匹配轉(zhuǎn)義符,u001B

婷婷五月深深久久精品 | 日韩毛片高清在线看| 久久久一本精品99久久精品66直播 | 亚洲精品国产V片在线观看 | 国产精品综合久久第一页| 日韩成人精品日本亚洲| 亚洲日韩人妻第一页| 国产九九久久99精品影院| 国产麻豆剧传媒精品网站| 久久久一本精品99久久精品66直播| 国产精品乳摇在线播放| 久久国语露脸国产精品电影| 88国产精品视频一区二区三区| 少妇人妻无码精品视频app| 久久精品免视看国产成人| 国产成人无码久久久精品一| 尹人久久久香蕉精品| 99久久精品国产高清一区二区| 国产精品99爱免费视频| 国产精品成人小电影在线观看| 一级一级特黄女人精品毛片| 九九免费久久这里有精品23| 无码人妻精品一区二区蜜桃百度 | 国产成人A人亚洲精品无码| 精品偷自拍另类在线观看丰满白嫩大屁股ass | 日韩一区二区三区精品| 最新国产精品好看的国产精品| 国产成人精品一区二区A片带套| 久久99国内精品自在现线| 精品无码人妻一区二区免费蜜桃 | 国产精品亚洲一区二区三区在线观看| 久久亚洲精品国产亚洲老地址| 国产精品bbwbbwbbw| 国产啪精品视频网免费| 亚洲国产精品美女久久久久| 亚洲精品无码永久在线观看男男| 国产香蕉国产精品偷在线观看| 国产网红无码精品视频| 国产精品v片在线观看不卡| 午夜精品久久久久久久| 99精品视频在线观看免费播放|