Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
正則表達(dá)式(RegEx)是一系列字符,定義搜索模式,用于查找字符串中特定的字符模式。
VBA正則表達(dá)式的語法與其他語言(如Python)中使用的語法有較大的區(qū)別,主要是因?yàn)閂BA的RegEx對(duì)象帶有可選參數(shù),因此有時(shí)必須指定這些參數(shù)以獲得與在其他語言中使用標(biāo)準(zhǔn)的正則表達(dá)式語法相同的結(jié)果。
VBA正則表達(dá)式語法基礎(chǔ)
正則表達(dá)式搜索模式是由一個(gè)或多個(gè)下列元素組成的字符序列:
元字符是字符或字符組合,在正則表達(dá)式模式中具有特殊含義。元字符可以匹配輸入文本中的幾個(gè)不同字符,甚至可以表示字符以外的其他字符。下面是需要熟練掌握的一些元字符。
通配符。未轉(zhuǎn)義的句點(diǎn)匹配任意字符,但新行除外。
“字符串或者行的開頭”或“否定”。插入符號(hào)在搜索模式中的重要性取決于上下文。1)如果在VBA中將參數(shù)設(shè)置為True,則插入符號(hào)表示“行首”,而不是“字符串的開頭”。2)如果插入符號(hào)放在一個(gè)字符類[^]中,它就像一個(gè)否定,即“匹配與字符類的其他參數(shù)不匹配的所有字符。”
“字符串的結(jié)尾。”搜索模式中美元符號(hào)的重要性取決于上下文。如果在VBA中將參數(shù)設(shè)置為True,則美元符號(hào)表示“行尾”,而不是“字符串結(jié)尾”。
“轉(zhuǎn)義字符。” 元字符前面的反斜杠將其轉(zhuǎn)換為文字字符。
\b
“字邊界”或“退格字符”。在字符類的外面,\b匹配文本源中單詞之前或之后的位置。在字符類中,\b表示退格符。
\B
“不是一個(gè)字邊界。”\B是\b的否定,但在字符類中沒有替代含義。
\d
“數(shù)字。”匹配從0至9的任意數(shù)字。
\D
“非數(shù)字。”匹配不是數(shù)字的任意字符。
\s
“空白”。匹配空格、換行符或制表符。
\S
“非空白。”匹配不是空格、換行符或制表符的字符。
字符^、$和\b稱為錨點(diǎn),因?yàn)樗鼈兤ヅ渥址啊⒅蠡蛑g的位置。
操作符
一些元字符改變了如何解釋搜索模式中的一個(gè)或多個(gè)其他元素,例如,它們對(duì)這些其他元素執(zhí)行操作。VBA正則表達(dá)式具有三種類型的運(yùn)算符。
布爾運(yùn)算“或”
元字符:|
說明:表示布爾“或”運(yùn)算符
示例:a|b匹配“a”或“b”
分組
元字符:()
說明:括號(hào)用于下列目的:1)定義運(yùn)算符的范圍和優(yōu)先級(jí);2)對(duì)字符進(jìn)行分組并記住文本。
示例:h(a|e)y匹配“hay”或“hey”
量化
元字符:?
說明:前一個(gè)元素出現(xiàn)0次或1次。
示例:colou?r匹配“color”和“colour”
元字符:*
說明:前一個(gè)元素出現(xiàn)0次或多次。
示例:ab*c匹配“ac”、“abc”、“abbc”、“abbbc”,等等
元字符:+
說明:前一個(gè)元素出現(xiàn)1次或多次。
示例:ab+c匹配“abc”、“abbc”、“abbbc”,等等,但不匹配“ac”
元字符:{n}
說明:前面的項(xiàng)目恰好匹配n次。
示例:a{3}匹配“aaa”
元字符:{min,}
說明:前面的項(xiàng)目匹配min次或更多次。
示例:a{1,}匹配“a”、“aa”、“aaa”,等等
元字符:{min,max}
說明:前面的項(xiàng)目匹配至少min次,但不多于max次。
示例:a{1,3}匹配“a”、“aa”和“aaa”,但不匹配“aaaa”
字符類
字符類或字符集使用方括號(hào)[]指定,一些最常見的如下:
[a-z]
范圍從a到z的小寫字母集。
[A-Z]
范圍從A到Z的大寫字母集。
[0-9]
范圍從0到9的單個(gè)數(shù)字集。
字符類經(jīng)常與搜索模式中的運(yùn)算符一起使用。例如,[0-5] +轉(zhuǎn)換為“找到一個(gè)或多個(gè)數(shù)字”,而不是僅從0到5的單個(gè)數(shù)字。
函數(shù)
在VBE菜單欄中,選取“工具——引用”命令,在“引用”對(duì)話框中找到并選取“ Regular 5.5”復(fù)選框,如下圖1所示。
圖1
插入一個(gè)標(biāo)準(zhǔn)模塊并輸入下面的代碼:
Sub ()
Dim r As Match
Dim As
Dim As String
Dim As String
= "在這個(gè)字符串中包含郵件地址,'Mary-Jo.T.+'."
="[a-z0-9-.+_]+@[a-z-]+\.[a-z]+"
Set = RegEx(,, , , True)
If Not Is Nothing Then
For Each r In
Debug.Print r
Next r
End If
End Sub
RegEx( , As String, _
As Boolean, As Boolean, _
As Boolean)
Dim As
Dim As New RegExp
If Then
With
.Global =
. =
. =
.Pattern =
End With
If .Test() Then
Set =.Execute()
Set RegEx =
End If
End If
End
過程將調(diào)用自定義的RegEx函數(shù)。在過程中,在變量中指定輸入文本,在變量中定義了搜索模式。代碼中,輸入文本包含一個(gè)假定電子郵件地址的字符串,其中包含有效電子郵件地址中允許的所有字符類型(允許+號(hào))。無論在輸入文本中如何重新排列該電子郵件地址,自定義函數(shù)RegEx都會(huì)找到它并將其返回,前提條件是,你要傳遞正確的參數(shù)。
在RegEx函數(shù)中前兩個(gè)參數(shù)是剛才討論的輸入字符串和搜索模式變量,這些參數(shù)是必需的,而接下來的三個(gè)參數(shù)可選:
在過程中,設(shè)置參數(shù)為False,但是如果我們將其設(shè)置為True并且在輸入文本中有多個(gè)電子郵件地址,那么它們將全部返回到匹配集合中。可選參數(shù)設(shè)置為True,否則搜索模式會(huì)變長:
[a-zA-Z0-9-.+_]+@[a-zA-Z-]+\.[a-zA-Z]+
上面模式中括號(hào)內(nèi)的項(xiàng)目表示字符集,后面跟著的加號(hào)是量詞,用于指定要查找字符的數(shù)量。中間的“@”字符表示搜索該字符,兩對(duì)雙括號(hào)中的點(diǎn)被反斜杠轉(zhuǎn)義,表示搜索文本中的點(diǎn)。
從左至右閱讀上述模式,其表達(dá)的意思如下:
查找一個(gè)或者多個(gè)從a到z的小寫字母或大寫字母、從0到9的數(shù)字、連字符(-)、點(diǎn)(.)、加號(hào)(+)或下劃線(_)
并查找
“@”符號(hào)
并查找
一個(gè)或者多個(gè)從a到z的小寫字母或大寫字母,或連字符(-)
并查找
“.”號(hào)
并查找
一個(gè)或者多個(gè)從a到z的小寫字母或大寫字母
如果滿足所有條件并且輸入的字符串中的所有匹配字符是連續(xù)的且順序正確,那么RegEx函數(shù)將返回匹配的結(jié)果。這意味著,如果搜索模式中含有空白字符,將從根本上改變其意義。如果你錯(cuò)誤地在搜索模式中包含了空白字符,那么RexEx將在你指定的其他字符中查找空格。
小結(jié)
正則表達(dá)式常用于“查找和替換”,其中替換功能使用RegEx對(duì)象的Replace方法。你可以使用VBA正則表達(dá)式進(jìn)行各種高級(jí)文本處理,包括:
雖然RegEx有很多非常好的應(yīng)用場合,但是也有一些不應(yīng)該使用的情形:
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。