正则表达式matches_正则表达式在VBA中间是如何应用?正则表达式的实现方式?...
Hi,大家好,本章節(jié)開始將會(huì)從零開始和大家用圖文的方式,讓你從零基礎(chǔ)學(xué)會(huì)正則表達(dá)式!有興趣的小伙伴可以持續(xù)關(guān)注我,或者在專欄中進(jìn)行查看自我學(xué)習(xí),愿與君攜手前行!
在上一個(gè)章節(jié)說到正則表達(dá)式的入門級知識點(diǎn),本節(jié)將會(huì)與大家分享一下正則表達(dá)式的是具體實(shí)現(xiàn)方式是怎么樣的?
在繼續(xù)學(xué)習(xí)正則元字符特性或編制自己的正則表達(dá)式時(shí),常常需要對其測試.也可以自己編制VBA代碼進(jìn)行測試,這樣做的好處是可以提高在今后實(shí)際工作應(yīng)用正則表達(dá)式的能力。所以,先介紹正則與VBA的交互的相關(guān)知識,讓你在VBA中間使用正則表達(dá)式游刃有余。當(dāng)然你也可以快速閱讀或直接越過本章內(nèi)容,在你以后的實(shí)際具體工作應(yīng)用時(shí),直接查閱即可。當(dāng)然也可以用上一章學(xué)到的知識詳細(xì)研究本章內(nèi)容,在以后的學(xué)習(xí)中專注于正則表達(dá)式本身.
正則處理文本,其實(shí)是通過正則表達(dá)式與程序設(shè)計(jì)語言的互相交互來實(shí)現(xiàn)。交互方式在不同編程語言中主要是分為三大類:
一是集成式。Perl語言本身內(nèi)建正則操作符,可以直接作用于正則表達(dá)式.操作符作用于正則表達(dá)式就像數(shù)學(xué)的+-號作用于數(shù)字一樣.不需要構(gòu)建正則對象。
二是函數(shù)式處理。Java等語言,為正則處理提供了一些便捷函數(shù),以節(jié)省工作量.用戶不需要首先創(chuàng)建一個(gè)正則對象,而是用靜態(tài)函數(shù)提的臨時(shí)對象來完成正則處理,處理完后把臨時(shí)對象拋棄. 正則表達(dá)式對于函數(shù)相當(dāng)于一個(gè)參數(shù), 這種方式的優(yōu)點(diǎn)是”隨手”可用,但不適宜在對時(shí)間要求很高的循環(huán)中使用.所以java也提供了下面講到的面向?qū)ο蟮某绦蚴教幚?
三是面向?qū)ο蟮某绦蚴教幚?。這種方式是大多數(shù)編程語言的正則處理方式。VBA平臺采用的也是這種方式。面向?qū)ο蟮某绦蚴教幚矸绞?#xff0c;首先必須創(chuàng)建一個(gè)正則對象的實(shí)例,然后設(shè)置對象必要的屬性,最后用對象的方法來完成指定的任務(wù)。
在上一章知識點(diǎn)中,給出了一個(gè)用VBA刪除行尾空格的正則處理例子,它代表了一般的代碼框架模式,下面再看一看它的結(jié)構(gòu)特點(diǎn),并對每一部分的代碼段進(jìn)行仔細(xì)的剖析,讓你充分了解正則表達(dá)式的應(yīng)用。
Sub?test()Dim?regx,S$,Strnew$???????????????????????????????1.定義變量代碼段S=”正則表達(dá)式其實(shí)很簡單?????“???????????????????2.目標(biāo)文本字串變量賦值代碼段Set?regx=createobject(“vbscript.regexp”)???3.創(chuàng)建正則對象代碼段Regx.pattern=”\s+$”??????????????????????????????4.設(shè)置正則對象的pattern屬性代碼段Regx.global=true????????????????????????????????????5.設(shè)置正則對象的其它屬性代碼段Strnew=regx.replace(s,””)???????????????????????????6.應(yīng)用正則對象方法代碼段Msgbox?strnewEnd sub1.定義變量代碼段,就是定義常規(guī)數(shù)據(jù)類型和變量。
2.目標(biāo)文本字符串賦值代碼段,目標(biāo)文本,可能存在于文本文檔、Word文檔、HTML文檔或Excel文檔等文檔之中。正則對象并不能直接作用于這些文檔,只能作用于它們的副本。所以用VBA正則處理這些文檔,必須首先從這些文檔中讀出字符串并賦值于字符變量。如果任務(wù)是修改文本,那么,你可能需要編寫額外的代碼將修改后的文本字符串重新寫回原文檔中. 目標(biāo)文本也可能分別存在于一個(gè)數(shù)組中,那么,你可能需要通過循環(huán)逐一處理.
3.創(chuàng)建正則對象代碼段,本處理的各種操作,都是通過操作正則對象來完成的.所以必須創(chuàng)建正則對象.VBA創(chuàng)建或聲明正則對象有兩方式:早期綁定和后期綁定,你可以根據(jù)自己喜好選擇其一:
早期綁定:?(需要在VBE--工具--引用中勾選Microsoft VBScript Regular Expressions 5.5)
后期綁定:
Dim regx AS RegExp
Set regx=new regexp (或dim regx as new regexp)
Set regex = CreateObject("VBScript.RegExp")
利用上述兩種方式創(chuàng)建或聲明正則對象,實(shí)際上是調(diào)用Microsoft VBScript腳本的regexp正則對象。Microssoft VBScript腳本,包含在Internet Eeplorer 5.5以及之后的版本中.該腳本中的正則表達(dá)式執(zhí)行的是ECMA-262第3版所規(guī)定的標(biāo)準(zhǔn),與JavaScript腳本中的正則執(zhí)行標(biāo)準(zhǔn)是相同的。1.0版只是為了向后兼容的目的,功能很弱。
4.設(shè)置對象的pattern屬性
語法:object.pattern=”正則表達(dá)式”
Object是一個(gè)正則對象.
把自己編制的正則表達(dá)式,以字符串的形式賦值給pattern屬性。注意要用英文雙引號將正則表達(dá)式包圍起來.
并且要在對象名與屬性名之間用英文點(diǎn)號隔開.屬性名pattern是保留字,固定不變的,對象名是用戶自定義的。
5.設(shè)置對象的其它屬性
除Pattern屬性外,正則對象還有其它三個(gè)屬性,其屬性值有False和True,默認(rèn)值都是False。如果要使用默認(rèn)屬性,可以不用顯示設(shè)置;如果要改變默認(rèn)屬性,則需要顯示設(shè)置:
Global ? ? ? ? ? ? ? 當(dāng)屬性值為False時(shí),只要在目標(biāo)文本中,找到一個(gè)匹配時(shí),即停止搜索。如果想要找出目標(biāo)文本中的所有匹配,那么需要把它的屬性值設(shè)置為True。
IgnoreCase ? ? ? ?設(shè)置對英文字母大小寫是否敏感。默認(rèn)值False, 對大小寫敏感;設(shè)置為True,忽略大小寫.
MultiLine ? ? ? ? ? ?它影響且只影響元字符^和$的意義。值為False,無論目標(biāo)文本是多少行,整個(gè)文本中則只有一個(gè)開始位置,^表示第一行的開始;只有一個(gè)行結(jié)束位置,$表示文本末尾位置。值為True,那么,^和$分別表示每一行的行首和行尾位置。
下面來完成一個(gè)簡單的任務(wù),再具體認(rèn)識各屬性的使用方法:
有一兩行的文本:
Aaa
Bbb
任務(wù)要求:
1.在文本開始和結(jié)束處,分別插入一個(gè)”@”符號;
2.在文本每行的開始和行尾分別插入”@”符號。
使用的正則表達(dá)式:
^|$ ? ? ? ? ? 表示匹配行開始或結(jié)束位置
Test1中間顯示的結(jié)果為@AaaBbb@,test02中間顯示的結(jié)果為 @Aaa@@Baa@。
Test2代碼與test1代碼唯一區(qū)別是修改了mutiline默認(rèn)屬性,設(shè)置為True。這就意為著,該文本的每一行都存在一個(gè)開始位置和結(jié)束位置。代碼1中修改了global的默認(rèn)屬性值,設(shè)置為true;目的是保證能找到并替換全部的開始或結(jié)束位置。如果保持默認(rèn)屬性,則只會(huì)在開始處插入一個(gè)@號。
正則對象Reg的其它兩個(gè)屬性保持為默認(rèn)。因?yàn)楸救蝿?wù)無關(guān)乎字母大小問題,所以IgnoreCase屬性無需要設(shè)置為Ture(當(dāng)然如果設(shè)置為true,對最后結(jié)果也無影響);由于Mutiline屬性保持默認(rèn),其值為False,所以整個(gè)文本只有一個(gè)開始位置和一個(gè)結(jié)束位置。
6.應(yīng)用對象的方法代碼段
VBScirpt正則對象的方法共有三個(gè):你可以根據(jù)任務(wù)要求選擇使用一個(gè)或多個(gè)方法.
(1)TEST方法
語法:Object.Test(string)
Test方法只是簡單測試目標(biāo)文本中,是否包含正則表達(dá)式所描述的字符串。如果存在,則返回True,否則返回False。
test方法的語法,在方法與正則對象之間也是用英文點(diǎn)號隔開,作為參數(shù),目標(biāo)字符串用英文括號包圍。
(2)Replace方法
替換在目標(biāo)文本中用正則表達(dá)式查找到的字符串。
前面例子中語句體現(xiàn)其語法:s=reg.replace(s,”@”)
后面括號中的參數(shù)S,代表前面代碼中設(shè)置的目標(biāo)文本字符串.也就是正則表達(dá)式將要作用的目標(biāo)文本.”@”是用來替換的字符串參數(shù).前面的s是Replace方法返回的結(jié)果,它是目標(biāo)文本被替換后的一個(gè)副本. 如果沒有找到匹配的文本,將返回與目標(biāo)文本一樣的一個(gè)副本.
(3)Execute方法
在目標(biāo)文本中執(zhí)行正則表達(dá)式搜索。
語法:set mh=object.execute(s)
其中mh是用戶自定的對象變量,S是值為目標(biāo)文本的字符串變量.object是正則對象.Execute方法會(huì)作用于目標(biāo)文本(S),并返回一個(gè)叫作"Matches"的集合對象,在這里是mh.在這個(gè)集合對象中包含它找到的所有叫做"Match"的成功匹配對象(Matches集合最多可容納65536個(gè)匹配對象). 如果未找到匹配,Execute 將返回空的 Matches 集合。Matches集合有兩個(gè)只讀屬性:索引(Item)和成功匹配的次數(shù)(Count).Matches集合中包含的匹配對象Match有四個(gè)只讀屬性:Value/firstindex/length/submatches。值得一提的是,Submatches屬性是一個(gè)集合屬性,集合中元素個(gè)數(shù)與正則表達(dá)式中使用的捕獲性括號的個(gè)數(shù)相同,每個(gè)元素的值就是括號包圍起來的內(nèi)容.它也有兩個(gè)只讀屬性:item和Count
現(xiàn)在已經(jīng)基本和大家闡述了正則表達(dá)式的基本思想,并和大家對正則在VBA中的實(shí)現(xiàn)作了詳細(xì)講解.接下來的時(shí)間我們將集中介紹VBA中可使用的全部元字符(序列),有的稱為元字符的"特性",有的叫作正則"語法".反正它的基本屬性就是用來描述字符的特殊字符.)
好啦!快樂的時(shí)間總是非常短暫的,又到了和大家說再見的時(shí)候,如果大家感覺本文如果對你有所幫助的話,請幫忙轉(zhuǎn)發(fā)點(diǎn)贊,謝謝您能觀看到現(xiàn)在,我們下期再見!
我是Excel教案,關(guān)注我持續(xù)分享更多的Excel技巧!
如果有不明白的或者不懂的可以在下方留言,我們會(huì)一一解答的。?
總結(jié)
以上是生活随笔為你收集整理的正则表达式matches_正则表达式在VBA中间是如何应用?正则表达式的实现方式?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python分析基金数据_python基
- 下一篇: 四线接近开关接线图_135张图!开关、电