vba正则表达式入门
正則表達式很強大且內(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。再聲明定義:
還可以直接用CreateObject方法創(chuàng)建:
創(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ù)字
用Test方法,判斷能否匹配到數(shù)字。
2)獲取所有編號
因為這個編號是3個大寫字母和多個數(shù)字組成。可以利用代碼中的表達式匹配到3個結(jié)果:ABC123155、ABD134215和CBC134216。
3)去掉字符串中的數(shù)字
執(zhí)行ClearNumber函數(shù),即可去掉數(shù)字。例如ClearNumber("你342好234啊"),可得到"你好啊"。
4)獲取子字符串
例如想獲取某些字符串中的部分?jǐn)?shù)據(jù),可以匹配完成之后,再用字符串函數(shù)處理。但其實不用,用元組可以一次性搞定。
這里,可以通過match的SubMatches集合獲取元組里面的內(nèi)容。輕松得到xxx1和xxx2。
7、其他說明
vba的正則表達式不是很完整,沒有遞歸的功能。遞歸是可以匹配公式或html代碼等。有興趣可以了解一下。
最近用到正則,故整理總結(jié)一下正則表達式中的一些需要轉(zhuǎn)義的特殊字符,以備日后查詢。
| 特別字符 | 說明 |
| $ | 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘\n’ 或 |
| ( ) | 標(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元器件封装大全
- 下一篇: java中的对象监视器