小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

vba正則表達(dá)式入門

 心靈地圖sxh 2019-01-27

正則表達(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ù)。主要限定符如下:

限定符含義
*表示前面字符或元字符出現(xiàn)0次或多次。例如:zo*m,可以匹配zm,zom,zoom
+表示前面字符或元字符出現(xiàn)1次或多次。例如:zo+m,可以匹配zom,zoom
?表示前面字符或元字符出現(xiàn)0次或1次。例如:zo?m,可以匹配zm,zom
{n}表示前面字符或元字符出現(xiàn)n次。例如:zo{3}m,可以匹配zooom
{n,m}表示前面字符或元字符出現(xiàn)n到m次。例如:zo{1,3}m,可以匹配zom,zoom,zooom
{n,}表示前面字符或元字符至少出現(xiàn)n次。例如:zo{2,}m,可以匹配zoom,zooom等等


當(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ù)點(diǎn),代表除了換行符以外的任意字符
\轉(zhuǎn)義,若我想匹配一些被正則表達(dá)式占用的字符,例如小數(shù)點(diǎn),可以用\.
[abc]匹配中括號(hào)內(nèi)的字符,例如[a-zA-Z],可以匹配到大小寫字母
[^abc]不匹配中括號(hào)內(nèi)的字符,例如[^a-z],表示不匹配小寫字母
\w可以匹配字母、下劃線和數(shù)字,相當(dāng)于[a-zA-Z0-9_]
\W大寫的W是小寫的w相反情況,也就是不匹配字母、下劃線和數(shù)字。相當(dāng)于[^a-zA-Z0-9_]
\s匹配任意空白符,相當(dāng)于[\f\n\r\t\v]
\S匹配任意非空符,相當(dāng)于[^\f\n\r\t\v]或[^\s]
\d匹配數(shù)字,相當(dāng)于[0-9]
\D匹配非數(shù)字,相當(dāng)于[^0-9]
\b匹配單詞的邊界。這個(gè)匹配英文單詞特別有用。例如\b[\w']+?\b就可以匹配任意單詞了
\f匹配換頁(yè)符
\n匹配換行符
\r匹配回車符
\t匹配tab制表符
\v匹配垂直制表符
^不在中括號(hào)內(nèi)的^,表示從字符串的開頭開始匹配
$表示匹配到字符串的結(jié)尾
x|y匹配x或y
(表達(dá)式)元組,用小括號(hào)括起來的表達(dá)式當(dāng)作一個(gè)元組,可以當(dāng)作一個(gè)整體,也可以被\1\2\3這樣類似索引獲取。


元字符比較多,這里就建議大家先收藏,需要用的時(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。再聲明定義:

  1. Dim reg As New RegExp

還可以直接用CreateObject方法創(chuàng)建:

  1. Dim reg As Object
  2. set reg = CreateObject("VBScript.Regexp")


創(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ù)字

  1. Public Function CheckNumber(str As String) As Boolean
  2.     Dim reg As Object
  3.     Set reg = CreateObject("VBScript.Regexp")
  4.             
  5.     Dim is_exist As Boolean    
  6.     With reg
  7.         .Global = True
  8.         .Pattern = "\d"        
  9.         is_exist = .Test(str)    
  10.     End With
  11.     CheckNumber = is_exist
  12. End Function

用Test方法,判斷能否匹配到數(shù)字。


2)獲取所有編號(hào)

  1. Public Sub GetCode()
  2.     Dim reg As Object
  3.     Set reg = CreateObject("VBScript.Regexp")
  4.     
  5.     Dim str As String
  6.     str = "編號(hào):ABC123155 日期:2016-01-11" & _
  7.           "編號(hào):ABD134215 日期:2016-02-21" & _
  8.           "編號(hào):CBC134216 日期:2016-01-15"
  9.     
  10.     reg.Global = True    reg.Pattern = "[A-Z]{3}\d+"        '獲取匹配結(jié)果'
  11.     Dim matches As Object, match As Object
  12.     Set matches = reg.Execute(str)
  13.     
  14.     '遍歷所有匹配到的結(jié)果'
  15.     For Each match In matches
  16.         '測(cè)試輸出到立即窗口'
  17.         Debug.Print match
  18.     Next
  19. End Sub

因?yàn)檫@個(gè)編號(hào)是3個(gè)大寫字母和多個(gè)數(shù)字組成??梢岳么a中的表達(dá)式匹配到3個(gè)結(jié)果:ABC123155、ABD134215和CBC134216。


3)去掉字符串中的數(shù)字

  1. Public Function ClearNumber(str As String) As String
  2.     Dim reg As Object    
  3.     Set reg = CreateObject("VBScript.Regexp")        
  4.     
  5.     reg.Global = True    
  6.     reg.Pattern = "\d"   
  7.     
  8.     '把所有數(shù)字替換成空'    
  9.     ClearNumber = reg.Replace(str, "")
  10. End Function

執(zhí)行ClearNumber函數(shù),即可去掉數(shù)字。例如ClearNumber("你342好234啊"),可得到"你好啊"。


4)獲取子字符串

例如想獲取某些字符串中的部分?jǐn)?shù)據(jù),可以匹配完成之后,再用字符串函數(shù)處理。但其實(shí)不用,用元組可以一次性搞定。

  1. Public Sub GetHref()    
  2.     Dim reg As Object    
  3.     Set reg = CreateObject("VBScript.Regexp")        
  4.     
  5.     Dim str As String    
  6.     str = "<a href='xxx1'>xxx1</a><a href='xxx2'>xxx2</a>"        
  7.     
  8.     reg.Global = True    
  9.     '獲取a標(biāo)簽中href的屬性值'    
  10.     reg.Pattern = "href='(.+?)'"        
  11.     
  12.     '獲取匹配結(jié)果'    
  13.     Dim matches As Object, match As Object    
  14.     Set matches = reg.Execute(str)        
  15.     
  16.     '遍歷所有匹配到的結(jié)果'    
  17.     For Each match In matches        
  18.         '測(cè)試輸出子表達(dá)式到立即窗口'        
  19.         Debug.Print match.SubMatches(0)
  20.     Next
  21. End Sub

這里,可以通過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)。效果如下圖:


代碼如下:

  1. '按鈕點(diǎn)擊事件'
  2. Sub btnQuery_Click()
  3. On Error GoTo Err_Handle:
  4.     Dim strCity As String
  5.     strCity = WorksheetFunction.VLookup([B2], [城市代碼表!A:B], 2, 0)
  6.     GetWeather strCity
  7.     Exit Sub
  8. Err_Handle:
  9.     MsgBox "請(qǐng)選擇省份和城市"
  10. End Sub
  11.  
  12. '網(wǎng)抓數(shù)據(jù)'
  13. '參數(shù):strCity 字符串,城市代碼'
  14. Public Sub GetWeather(strCity As String)
  15. On Error GoTo Err_Handle:
  16.     [A5:D11].ClearContents  '清空數(shù)據(jù)'
  17.     
  18.     '創(chuàng)建XmlHttp對(duì)象'
  19.     Dim xmlHttp As Object
  20.     Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
  21.     
  22.     '創(chuàng)建并發(fā)送請(qǐng)求'
  23.     xmlHttp.Open "GET", "http://www.weather.com.cn/weather/" & strCity & ".shtml", False
  24.     xmlHttp.setRequestHeader "If-Modified-Since", "0"   '不要緩存'
  25.     xmlHttp.Send
  26.     
  27.     '等待響應(yīng)'
  28.     Do While xmlHttp.readyState <> 4
  29.         DoEvents
  30.     Loop
  31.     
  32.     '得到響應(yīng)結(jié)果'
  33.     Dim strResponse As String
  34.     strResponse = xmlHttp.responsetext
  35.     
  36.     '創(chuàng)建正則表達(dá)式對(duì)象'
  37.     Dim regExp As Object
  38.     Set regExp = CreateObject("VBScript.RegExp")
  39.     
  40.     '設(shè)置正則表達(dá)式'
  41.     regExp.Global = True
  42.  
  43.     '這個(gè)表達(dá)式比較復(fù)雜,估計(jì)只有上帝和我知道是怎么回事。'
  44.     '過段時(shí)間應(yīng)該就只有上帝才知道。'
  45.     '具體分析可以看我的《Excel vba 網(wǎng)抓教程》'
  46.     regExp.Pattern = "([\s\S]+?)[\s\S]+?""wea"">([\s\S]+?)[\s\S]+?(\d+?)[\s\S]+?([\s\S]+?)[\s\S]+?([\s\S]+?)" 
  47.     
  48.     '匹配結(jié)果'
  49.     Dim matches As Object, i As Long, arr()
  50.     Set matches = regExp.Execute(strResponse)
  51.     If matches.Count = 0 Then
  52.         MsgBox "找不到天氣信息"
  53.         Exit Sub
  54.     End If
  55.     
  56.     '處理匹配結(jié)果'
  57.     ReDim arr(matches.Count - 1, 3)
  58.     For i = 0 To matches.Count - 1
  59.         arr(i, 0) = matches(i).SubMatches(0)
  60.         arr(i, 1) = matches(i).SubMatches(1)
  61.         arr(i, 2) = matches(i).SubMatches(2) & "/" & matches(i).SubMatches(3)
  62.         arr(i, 3) = matches(i).SubMatches(4)
  63.     Next
  64.  
  65.     [A5:D11] = arr  '寫到Excel中'
  66.     Exit Sub
  67. Err_Handle:
  68.     MsgBox Err.Description
  69. End Sub


原理不復(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è)的二維碼打賞支持我 ^_^

分享到:

上一篇:Django在WebFaction服務(wù)器的郵箱設(shè)置

下一篇:Python字符串處理方法總結(jié)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多