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