日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vba正则表达式入门

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vba正则表达式入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正則表達式很強大且內(nèi)容比較多。不少初學(xué)者學(xué)這個表示很困難。故寫一篇入門的教程。

1、什么是正則表達式

正則表達式是一個天才創(chuàng)建的用于快速檢索匹配字符串,通過簡單的表達式匹配文本。

2、正則表達式的組成

正則表達式也是一個字符串,包括元字符、限定符和正常意義的字符。正則表達式強大的地方就在元字符和限定符。

3、限定符

很多人講這個都是先講元字符。其實先講限定符更加容易吸收。限定符是表示前面字符或元字符出現(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)然,限定符用法不止這些。正則表達式還有個規(guī)則叫貪婪與吝嗇。有些人也叫貪婪與懶惰。這個“貪婪與吝嗇”是正則表達式難點和重點之一。

例如,字符串“n123n456n789n”。那么我們怎么匹配獲取“n123n”和“n123n456n789n”呢。

使用正則表達式,首先要找規(guī)律。很明顯我們要獲取的內(nèi)容開頭和結(jié)尾都有一個字母n,中間是數(shù)字或字母。我們先學(xué)一個元字符。元字符是可以代表一定含義或規(guī)律的字符??梢云ヅ涑藫Q行符之外的任意字符是小數(shù)點。

那么我們的表達式可以這么寫:n.+n

兩個字母n,中間夾著1個或多個任意字符。

但這樣只能匹配得到一個結(jié)果:n123n456n789n。在我們沒有對其任何限制的情況下,正則表達式會盡可能多匹配符合條件的結(jié)果。從頭到尾整個都符合,所以都匹配了。這個稱之為貪婪匹配。

那如何做到盡可能少的匹配。這個就需要加個?進行限制。

例如,表達式:n.+?n

這個表達式盡可能少匹配,也就是說碰到一次符合條件的就立馬返回結(jié)果。結(jié)果可以匹配到“n123n”、“n789n”。

這種規(guī)則叫做吝嗇匹配。只要在限定符后面再加個問號即可。

????

4、元字符

元字符是用于匹配字符串,可以代表一定含義或規(guī)律的字符串。主要的元字符如下:

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

元字符比較多,這里就建議大家先收藏,需要用的時候再查閱。多用幾次就自然記住了。

這里還有個小技巧,若我想匹配全部任意字符,包括換行符??梢杂靡唤M相反的元字符,例如[\s\S],就可以匹配全部任意字符。

? ?

5、常見的正則表達式

說了這么多,暈了沒?看一些實例:

1)匹配郵編,郵編是6位數(shù)字。正則表達式:\d{6}

2)匹配手機,手機號是11位數(shù)字。正則表達式:\d{11}

3)匹配電話,電話是區(qū)號-號碼組成,區(qū)號有3到4位,號碼有6到9位。正則表達式:\d{3,4}-\d{6,9}

4)匹配日期,日期格式如1992-5-30,明顯數(shù)字加橫線組成。正則表達式:\d{4}-\d{1,2}-\d{1,2}

5)匹配漢字,漢字需要通過編碼轉(zhuǎn)義,漢字都unicode編碼中都在一個范圍內(nèi)。正則表達式:[\u4e00-\u9fa5]

6、vba中使用正則表達式

若只是上面這些內(nèi)容,那么還是紙上談兵,需要應(yīng)用到實際中??纯慈绾卧趘ba中使用正則表達式。

vba使用正則表達式需要用到一個RegExp對象。

該對象可以通過引用Microsoft?VBScript?Regular?Expressions?5.5。再聲明定義:

  • Dim?reg?As?New?RegExp
  • 還可以直接用CreateObject方法創(chuàng)建:

  • Dim?reg?As?Object
  • set?reg?=?CreateObject("VBScript.Regexp")
  • 創(chuàng)建RegExp對象之后,看看它的相關(guān)屬性和方法。

    屬性:

    1)Global,是否全局匹配,若為False,匹配到一個結(jié)果之后,就不再匹配。默認(rèn)False,建議設(shè)為True;

    2)IgnoreCase,是否忽略大小寫,默認(rèn)False,建議設(shè)為False,這個會影響到正常表達式匹配;

    3)Multiline,是否跨行匹配,默認(rèn)False,建議設(shè)為False,這個會影響到正常表達式匹配;

    4)Pattern,獲取或設(shè)置正則表達式。

    方法:

    1)Execute,執(zhí)行匹配

    2)Replace,根據(jù)正確表達式全部替換

    3)Test,測試正則表達式能否匹配到內(nèi)容

    ????

    舉一些典型的例子:

    1)判斷是否存在數(shù)字

  • Public?Function?CheckNumber(str?As?String)?As?Boolean
  • ????Dim?reg?As?Object
  • ????Set?reg?=?CreateObject("VBScript.Regexp")
  • ????????????
  • ????Dim?is_exist?As?Boolean????
  • ????With?reg
  • ????????.Global?=?True
  • ????????.Pattern?=?"\d"????????
  • ????????is_exist?=?.Test(str)????
  • ????End?With
  • ????CheckNumber?=?is_exist
  • End?Function
  • 用Test方法,判斷能否匹配到數(shù)字。

    2)獲取所有編號

  • Public?Sub?GetCode()
  • ????Dim?reg?As?Object
  • ????Set?reg?=?CreateObject("VBScript.Regexp")
  • ????
  • ????Dim?str?As?String
  • ????str?=?"編號:ABC123155?日期:2016-01-11"?&?_
  • ??????????"編號:ABD134215?日期:2016-02-21"?&?_
  • ??????????"編號:CBC134216?日期:2016-01-15"
  • ????
  • ????reg.Global?=?True????reg.Pattern?=?"[A-Z]{3}\d+"????????'獲取匹配結(jié)果'
  • ????Dim?matches?As?Object,?match?As?Object
  • ????Set?matches?=?reg.Execute(str)
  • ????
  • ????'遍歷所有匹配到的結(jié)果'
  • ????For?Each?match?In?matches
  • ????????'測試輸出到立即窗口'
  • ????????Debug.Print?match
  • ????Next
  • End?Sub
  • 因為這個編號是3個大寫字母和多個數(shù)字組成。可以利用代碼中的表達式匹配到3個結(jié)果:ABC123155、ABD134215和CBC134216。

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

  • Public?Function?ClearNumber(str?As?String)?As?String
  • ????Dim?reg?As?Object????
  • ????Set?reg?=?CreateObject("VBScript.Regexp")????????
  • ????
  • ????reg.Global?=?True????
  • ????reg.Pattern?=?"\d"???
  • ????
  • ????'把所有數(shù)字替換成空'????
  • ????ClearNumber?=?reg.Replace(str,?"")
  • End?Function
  • 執(zhí)行ClearNumber函數(shù),即可去掉數(shù)字。例如ClearNumber("你342好234啊"),可得到"你好啊"。

    4)獲取子字符串

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

  • Public?Sub?GetHref()????
  • ????Dim?reg?As?Object????
  • ????Set?reg?=?CreateObject("VBScript.Regexp")????????
  • ????
  • ????Dim?str?As?String????
  • ????str?=?"<a?href='xxx1'>xxx1</a><a?href='xxx2'>xxx2</a>"????????
  • ????
  • ????reg.Global?=?True????
  • ????'獲取a標(biāo)簽中href的屬性值'????
  • ????reg.Pattern?=?"href='(.+?)'"????????
  • ????
  • ????'獲取匹配結(jié)果'????
  • ????Dim?matches?As?Object,?match?As?Object????
  • ????Set?matches?=?reg.Execute(str)????????
  • ????
  • ????'遍歷所有匹配到的結(jié)果'????
  • ????For?Each?match?In?matches????????
  • ????????'測試輸出子表達式到立即窗口'????????
  • ????????Debug.Print?match.SubMatches(0)
  • ????Next
  • End?Sub
  • 這里,可以通過match的SubMatches集合獲取元組里面的內(nèi)容。輕松得到xxx1和xxx2。

    7、其他說明

    vba的正則表達式不是很完整,沒有遞歸的功能。遞歸是可以匹配公式或html代碼等。有興趣可以了解一下。

    最近用到正則,故整理總結(jié)一下正則表達式中的一些需要轉(zhuǎn)義的特殊字符,以備日后查詢。

    特別字符

    說明

    $

    匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或
    ‘\r’。要匹配 $ 字符本身,請使用
    \$。

    ( )

    標(biāo)記一個子表達式的開始和結(jié)束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。

    *

    匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \*。

    +

    匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+。

    .

    匹配除換行符 \n之外的任何單字符。要匹配.,請使用\.

    [ ]

    標(biāo)記一個中括號表達式的開始。要匹配 [,請使用 \[。

    匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 字符,請使用 \ 。

    \

    將下一個字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進制轉(zhuǎn)義符。例如, ‘n’ 匹配字符 ‘n’。’\n’
    匹配換行符。序列 ‘\\’ 匹配 “\”,而 ‘\(‘ 則匹配 “(”。

    ^

    匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^。

    { }

    標(biāo)記限定符表達式的開始。要匹配 {,請使用 \{。

    |

    指明兩項之間的一個選擇。要匹配 |,請使用 \|。

    PS:經(jīng)過后面使用發(fā)現(xiàn)/也需要轉(zhuǎn)義,轉(zhuǎn)義為

    //

    總結(jié)

    以上是生活随笔為你收集整理的vba正则表达式入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。