概述VB.NET正則表達(dá)式簡(jiǎn)化程序代碼
經(jīng)過(guò)長(zhǎng)時(shí)間學(xué)習(xí)VB.NET正則表達(dá)式,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。在通常的程序設(shè)計(jì)中,對(duì)字符串的操作是不可缺少的部分。例如,我們經(jīng)常需要從字符串中尋找特定的部分,或者對(duì)某一部分進(jìn)行替換、刪除等等。使用傳統(tǒng)的靜態(tài)字符串操作方法只能查找字符串中固定不變的部分,缺乏靈活性。而用正則表達(dá)式則可以規(guī)定待查找字符串的模式,查找同一類(lèi)型的字符串,例如要在EMAIL格式的字符串(如lzcarl@126.com)中分解出用戶(hù)名和服務(wù)器名,可以定義如下的正則表達(dá)式(?<user>[^@]+)@(?<host>.+),然后使用相應(yīng)的解析器進(jìn)行解析,得到兩個(gè)分組user組和host組,user組里存儲(chǔ)用戶(hù)名lzcarl,host組里存放服務(wù)器名126.com,而用傳統(tǒng)的方法是很難實(shí)現(xiàn)這種分解的。由此可見(jiàn),作為一種字符串處理方式,正則表達(dá)式的靈活與強(qiáng)大確實(shí)是傳統(tǒng)字符串處理方式無(wú)法相比的。
1、VB.NET正則表達(dá)式處理類(lèi)
在VB.NET正則表達(dá)式必須先引入命名空間System.Text.RegularExpressions,該命名空間包含一下七個(gè)類(lèi):Regex、Match、MatchCollection、GroupCollection、CaptureCollection、Group、Capture。
Regex類(lèi)表示不可變(只讀)正則表達(dá)式類(lèi),設(shè)置待匹配字符串的模式。Match 類(lèi)表示正則表達(dá)式匹配操作的結(jié)果。MatchCollection 類(lèi)表示成功的非重疊匹配的序列,即匹配后得到的字符串集合。在正則表達(dá)式中應(yīng)用最多的就是這三個(gè)類(lèi)。
使用正則表達(dá)式類(lèi)的通用方法是:
首先生成一個(gè)Regex類(lèi)的實(shí)例,并在傳入?yún)?shù)中輸入正則表達(dá)式的模式,然后使用Regex類(lèi)的相應(yīng)方法,如IsMatch(判斷是否匹配)、Match(返回匹配得到的字符串)等等。
當(dāng)然也可以使用Regex類(lèi)的共享方法而不實(shí)例化Regex類(lèi)——IsMatch、Match等等(即上述方法的共享版本)獲得所需要的結(jié)果。這種方法適于匹配模式不固定,匹配次數(shù)不多的情況。
接下來(lái)給出一個(gè)VB.NET中正則表達(dá)式的應(yīng)用。
2、時(shí)間解析程序
該程序讀取用戶(hù)輸入的時(shí)間長(zhǎng)度字符串(如XX小時(shí)XX分鐘XX秒),把它解析,***用秒表示該時(shí)間長(zhǎng)度(XX秒)。程序界面如下:
當(dāng)用戶(hù)在文本框中輸入時(shí)間值后,點(diǎn)計(jì)算后就會(huì)在“結(jié)果”后面得到用秒表示的時(shí)間值。該程序首先從文本框中讀入時(shí)間值,然后分別查找其中的小時(shí)、分鐘、秒部分,在這里就使用了正則表達(dá)式對(duì)時(shí)間表達(dá)式進(jìn)行解析。如小時(shí)數(shù)的正則表達(dá)式可表示為“[0-9]+小時(shí)”?!癧0-9]”表示0到9間的任意數(shù)字都可以被匹配,“+”表示該字符可以出現(xiàn)一次或更多,因此“[0-9]+”即可以匹配任意長(zhǎng)度整數(shù)(關(guān)于正則表達(dá)式的語(yǔ)法可以參見(jiàn)MSDN的相應(yīng)部分),用這個(gè)字符串模式就可以查找出表達(dá)式中的小時(shí)部分。在分別匹配得到小時(shí)數(shù)、分鐘數(shù)和秒數(shù)后計(jì)算得到總的秒數(shù),并顯示在“結(jié)果”后面。
程序包括一個(gè)計(jì)算時(shí)間的正則表達(dá)式工具類(lèi)TimeRegex,及Form1界面類(lèi)。
TimeRegex類(lèi)代碼如下:
- ImportsSystem.Text.RegularExpressions
- PublicClassTimeRegex
- PrivatehourAsInteger=0
- PrivateminuteAsInteger=0
- PrivatesecondAsInteger=0
- PrivatetotalTimeAsInteger=0
- PrivateexpAsString'時(shí)間表達(dá)式
- SubNew()
- EndSub
- '根據(jù)時(shí)間文本解析出其中的數(shù)字部分
- PrivateFunctiongetTime(ByValtimeKindAsString)AsString
- DimtimeMatchAsMatch
- DimtimeAsString
- '先從中解析出包含數(shù)字和中文的部分
- timeMatch=Regex.Match(exp,timeKind)
- IftimeMatch.Success=TrueThen
- time=timeMatch.Value
- '然后從得到的文本中解析出數(shù)字
- ReturnRegex.Match(time,"[0-9]+").Value
- Else
- Return"0"
- EndIf
- EndFunction
- '根據(jù)傳入的表達(dá)式計(jì)算總時(shí)間
- PublicFunctiongetTotalTime(ByVal_expAsString)AsInteger
- exp=_exp
- '分別計(jì)算出小時(shí),分鐘,秒,然后得到總時(shí)間
- hour=Integer.Parse(getTime("[0-9]+小時(shí)"))
- minute=Integer.Parse(getTime("[0-9]+分鐘"))
- second=Integer.Parse(getTime("[0-9]+秒"))
- totalTime=hour*3600+minute*60+second
- ReturntotalTime
- EndFunction
- EndClass
- Form1類(lèi)代碼如下:
- PublicClassForm1
- InheritsSystem.Windows.Forms.Form
- PrivateregexAsNewTimeRegex
- Windows窗體設(shè)計(jì)器生成代碼省略
- PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
- SecondTime.Text=regex.getTotalTime
- (timeExp.Text).ToString&"秒"
- EndSub
- EndClass
3、結(jié)論
合理的使用VB.NET正則表達(dá)式對(duì)于簡(jiǎn)化程序代碼、提高程序的復(fù)用性與健壯性有著很大的幫助??梢哉f(shuō)正則表達(dá)式是程序員必須掌握的幾種武器之一。而.NET中對(duì)正則表達(dá)式也有較好的支持,以后在處理字符串的時(shí)候,不妨使用一下正則表達(dá)式,一定可以起到事半功倍的效果。
【編輯推薦】