|
正則表達(dá)式很強(qiáng)大且內(nèi)容比較多。不少初學(xué)者學(xué)這個(gè)表示很困難。故寫一篇入門的教程。 1、什么是正則表達(dá)式正則表達(dá)式是一個(gè)天才創(chuàng)建的用于快速檢索匹配字符串,通過簡(jiǎn)單的表達(dá)式匹配文本。 2、正則表達(dá)式的組成正則表達(dá)式也是一個(gè)字符串,包括元字符、限定符和正常意義的字符。正則表達(dá)式強(qiáng)大的地方就在元字符和限定符。 3、限定符很多人講這個(gè)都是先講元字符。其實(shí)先講限定符更加容易吸收。限定符是表示前面字符或元字符出現(xiàn)的次數(shù)。主要限定符如下:
當(dāng)然,限定符用法不止這些。正則表達(dá)式還有個(gè)規(guī)則叫貪婪與吝嗇。有些人也叫貪婪與懶惰。這個(gè)“貪婪與吝嗇”是正則表達(dá)式難點(diǎn)和重點(diǎn)之一。 例如,字符串“n123n456n789n”。那么我們?cè)趺雌ヅ浍@取“n123n”和“n123n456n789n”呢。 使用正則表達(dá)式,首先要找規(guī)律。很明顯我們要獲取的內(nèi)容開頭和結(jié)尾都有一個(gè)字母n,中間是數(shù)字或字母。我們先學(xué)一個(gè)元字符。元字符是可以代表一定含義或規(guī)律的字符??梢云ヅ涑藫Q行符之外的任意字符是小數(shù)點(diǎn)。 那么我們的表達(dá)式可以這么寫:n.+n 兩個(gè)字母n,中間夾著1個(gè)或多個(gè)任意字符。 但這樣只能匹配得到一個(gè)結(jié)果:n123n456n789n。在我們沒有對(duì)其任何限制的情況下,正則表達(dá)式會(huì)盡可能多匹配符合條件的結(jié)果。從頭到尾整個(gè)都符合,所以都匹配了。這個(gè)稱之為貪婪匹配。 那如何做到盡可能少的匹配。這個(gè)就需要加個(gè)?進(jìn)行限制。 例如,表達(dá)式:n.+?n 這個(gè)表達(dá)式盡可能少匹配,也就是說碰到一次符合條件的就立馬返回結(jié)果。結(jié)果可以匹配到“n123n”、“n789n”。 這種規(guī)則叫做吝嗇匹配。只要在限定符后面再加個(gè)問號(hào)即可。 4、元字符元字符是用于匹配字符串,可以代表一定含義或規(guī)律的字符串。主要的元字符如下:
元字符比較多,這里就建議大家先收藏,需要用的時(shí)候再查閱。多用幾次就自然記住了。 這里還有個(gè)小技巧,若我想匹配全部任意字符,包括換行符??梢杂靡唤M相反的元字符,例如[\s\S],就可以匹配全部任意字符。 5、常見的正則表達(dá)式 說了這么多,暈了沒?看一些實(shí)例: 1)匹配郵編,郵編是6位數(shù)字。正則表達(dá)式:\d{6} 2)匹配手機(jī),手機(jī)號(hào)是11位數(shù)字。正則表達(dá)式:\d{11} 3)匹配電話,電話是區(qū)號(hào)-號(hào)碼組成,區(qū)號(hào)有3到4位,號(hào)碼有6到9位。正則表達(dá)式:\d{3,4}-\d{6,9} 4)匹配日期,日期格式如1992-5-30,明顯數(shù)字加橫線組成。正則表達(dá)式:\d{4}-\d{1,2}-\d{1,2} 5)匹配漢字,漢字需要通過編碼轉(zhuǎn)義,漢字都unicode編碼中都在一個(gè)范圍內(nèi)。正則表達(dá)式:[\u4e00-\u9fa5] 6、vba中使用正則表達(dá)式 若只是上面這些內(nèi)容,那么還是紙上談兵,需要應(yīng)用到實(shí)際中。看看如何在vba中使用正則表達(dá)式。 vba使用正則表達(dá)式需要用到一個(gè)RegExp對(duì)象。 該對(duì)象可以通過引用Microsoft VBScript Regular Expressions 5.5。再聲明定義:
還可以直接用CreateObject方法創(chuàng)建:
創(chuàng)建RegExp對(duì)象之后,看看它的相關(guān)屬性和方法。 屬性: 1)Global,是否全局匹配,若為False,匹配到一個(gè)結(jié)果之后,就不再匹配。默認(rèn)False,建議設(shè)為True; 2)IgnoreCase,是否忽略大小寫,默認(rèn)False,建議設(shè)為False,這個(gè)會(huì)影響到正常表達(dá)式匹配; 3)Multiline,是否跨行匹配,默認(rèn)False,建議設(shè)為False,這個(gè)會(huì)影響到正常表達(dá)式匹配; 4)Pattern,獲取或設(shè)置正則表達(dá)式。 方法: 1)Execute,執(zhí)行匹配 2)Replace,根據(jù)正確表達(dá)式全部替換 3)Test,測(cè)試正則表達(dá)式能否匹配到內(nèi)容 舉一些典型的例子: 1)判斷是否存在數(shù)字
用Test方法,判斷能否匹配到數(shù)字。 2)獲取所有編號(hào)
因?yàn)檫@個(gè)編號(hào)是3個(gè)大寫字母和多個(gè)數(shù)字組成??梢岳么a中的表達(dá)式匹配到3個(gè)結(jié)果:ABC123155、ABD134215和CBC134216。 3)去掉字符串中的數(shù)字
執(zhí)行ClearNumber函數(shù),即可去掉數(shù)字。例如ClearNumber("你342好234啊"),可得到"你好啊"。 4)獲取子字符串 例如想獲取某些字符串中的部分?jǐn)?shù)據(jù),可以匹配完成之后,再用字符串函數(shù)處理。但其實(shí)不用,用元組可以一次性搞定。
這里,可以通過match的SubMatches集合獲取元組里面的內(nèi)容。輕松得到xxx1和xxx2。 7、其他說明 vba的正則表達(dá)式不是很完整,沒有遞歸的功能。遞歸是可以匹配公式或html代碼等。有興趣可以了解一下。 (原創(chuàng)博文,轉(zhuǎn)載請(qǐng)注明來自 楊仕航的博客!本文鏈接:http:///blog/94) 如何在Excel VBA 中使用正則表達(dá)式? https://jingyan.baidu.com/article/046a7b3efcc75af9c37fa944.html 在“代碼窗口“中復(fù)制粘貼以下代碼: Sub RegTest() '定義正則表達(dá)式對(duì)象 Dim oRegExp As Object '定義匹配字符串集合對(duì)象 Dim oMatches As Object '創(chuàng)建正則表達(dá)式 '定義要執(zhí)行正則查找的文本變量 Dim sText As String sText = "這是v一個(gè)正則表達(dá)式b的范例程序a代碼" Set oRegExp = CreateObject("vbscript.regexp") With oRegExp '設(shè)置是否匹配所有的符合項(xiàng),True表示匹配所有, False表示僅匹配第一個(gè)符合項(xiàng) .Global = True '設(shè)置是否區(qū)分大小寫,True表示不區(qū)分大小寫, False表示區(qū)分大小寫 .IgnoreCase = True '設(shè)置要查找的字符模式 .Pattern = "[\u4e00-\u9fa5]+" '判斷是否可以找到匹配的字符,若可以則返回True MsgBox .Test(sText) '對(duì)字符串執(zhí)行正則查找,返回所有的查找值的集合,若未找到,則為空 Set oMatches = .Execute(sText) '把字符串中用正則找到的所有匹配字符替換為其它字符 MsgBox .Replace(sText, "") End With Set oRegExp = Nothing Set oMatches = Nothing End Sub 執(zhí)行以上代碼,將把 sText = "這是v一個(gè)正則表達(dá)式b的范例程序a代碼" 變量中的中文字符全部刪除,將只返回"vba"3個(gè)英文字符,如下圖所示。其中的.Pattern = "[\u4e00-\u9fa5]+"表示匹配所有中文字符,Pattern屬性是正則表達(dá)式對(duì)象的核心,當(dāng)需要執(zhí)行其它查找替換時(shí)一般都只需更改Pattern屬性即可。 一些常見的正則Pattern如下: [0-9]表示匹配任意一個(gè)數(shù)字 [a-zA-Z]表示匹配任意一個(gè)英文字母 [\u4e00-\u9fa5]表示匹配任意一個(gè)中文字符 Excel vba 網(wǎng)抓天氣預(yù)報(bào) 最近在弄Excel vba 網(wǎng)抓教程,寫了不少實(shí)例。春節(jié)過后,寫個(gè)網(wǎng)抓天氣預(yù)報(bào)。 這個(gè)天氣預(yù)報(bào)有現(xiàn)成的接口,不過要注冊(cè)賬號(hào)什么的,有些麻煩。所以,我打算直接抓取“中國(guó)天氣網(wǎng)”的數(shù)據(jù)。 在第一個(gè)表格加一個(gè)按鈕,選擇省份和城市,再點(diǎn)擊按鈕即可。那些城市代碼信息也是我自己收集整理的,弄了一個(gè)下拉框聯(lián)動(dòng)。效果如下圖:
代碼如下:
原理不復(fù)雜,就是通過城市代碼抓取對(duì)應(yīng)的天氣預(yù)報(bào)數(shù)據(jù)。通過正則表達(dá)式匹配結(jié)果并處理。 百度網(wǎng)盤下載:http://pan.baidu.com/s/1eRdmpaU 密碼: ehq9 (原創(chuàng)博文,轉(zhuǎn)載請(qǐng)注明來自 楊仕航的博客!本文鏈接:http:///blog/30) 若對(duì)你有幫助,不妨掃一掃右側(cè)的二維碼打賞支持我 ^_^ |
|
|