VBA 正規表示式

2021-06-06 20:19:27 字數 4116 閱讀 7886

①正規表示式的概述

正規表示式原本是形式語言理論中的概念,與編譯器的構造有密切的聯絡。但是作為乙個應用軟體的使用者,我們沒有必要去細究正規表示式的嚴格定義和處理方法。本文將從實用的角度出發,闡述引入正規表示式的目的、正規表示式的命令格式,以及如何利用正規表示式完成一些實際的文字處理工作。

我們在處理文字時,經常會遇到一些具有某種特定格式,或者說滿足某種規則的文字。比如,乙個無符號的整數由一連串的數字構成,而乙個email位址的格式則是「使用者名稱@主機名」,其中使用者名稱是一串字母或數字,主機名則是由若干個由「.」分隔的字母數字串。正規表示式就是用來指定這種規則的。如果某個字串滿足正規表示式指定的規則,則稱該字串為正規表示式的乙個「匹配串」。

②正規表示式的構成

為了方便理解,讓我們先來看看大家比較熟悉的數學表示式,「(x 3)*2 y」是乙個典型的數學表示式。乙個數學表示式由若干個「項」組成,「項」與「項」之間用加號或減號相連;這裡「(x 3)*2」和「y」分別是兩個項。每個項又由若干個「因子」組成,因子之間用乘號或除號相連;這裡第乙個項有兩個因子「(x 3)」和「2」,而第二個項只有乙個因子「y」。每個因子可以是乙個簡單的數,乙個代數變數,也可以是放在括號裡面的另乙個表示式。對於最後一種情況,括號中的表示式稱為「子表示式」;這裡「x 3」就是乙個子表示式。

正規表示式的結構與數學表示式很相似。與數學表示式的「項」相對應,正規表示式由若干個「分支」構成,「分支」之間用符號「|」相連。從邏輯上講,分支之間是一種「或」的關係,乙個字串只要與正規表示式中的任何乙個分支相匹配,這個字串就與整個正規表示式相匹配。比如,「第三人稱代詞」可以用正規表示式表示為「他|她|它|他們|她們|它們」。

與數學表示式的「因子」相對應,構成正規表示式「分支」的部件稱為「原子」。「原子」與「原子」之間沒有任何符號相連。從邏輯上講,原子之間是串接的關係,乙個字串必須與各個原子依次相匹配,才算與這個分支相匹配。比如在上面的例子中,分支「他們」由兩個原子「他」和「們」組成。

正規表示式的本質是它的「原子」可以有多種不同的形式。前面的例子是最簡單的情形,即每個原子由乙個普通字元組成。除此以外,「原子」還可以是特殊符號、萬用字元、字符集以及子表示式。

a、特殊符號

可以作為特殊符號的原子有:

^ 匹配行首。例如,「^他」匹配出現在行首的「他」 字。值得注意的是,這個符號僅僅表示「行首」這個 位置,與它相匹配的字串長度為0;

$ 匹配行末。與「^」相似,它僅表示「行末」這個位 置。例如,「。$」匹配出現在行末的句號;

< 匹配詞首。詞首的定義是緊接在非字母數字之後的第 乙個字母數字或下劃線(_),漢字永遠是詞首。與「^」 相似,它僅表示「詞首」這個位置,匹配長度為0;

> 匹配詞尾。詞尾是指緊接在字母數字或下劃線之後的 第乙個非字母數字下劃線,任一漢字之後也屬於詞尾。 詞尾的匹配長度也是0;

\t tab字元;

\e esc字元;

b、萬用字元

萬用字元是用乙個符號(或幾個符號組合)來匹配某一類滿足條件的字元。可以使用萬用字元來查詢字元是正規表示式的一大特點。萬用字元(注意大小寫的區別):

半形部分: .(句點) 匹配任何字元; \a 匹配任意英文本母; \~a 匹配除字母外的任意字元; \d 匹配任意數字; \~d 匹配除數字外的任意字元; \h 匹配任意詞首字元(字母及下劃線); \~h 匹配除字母及下劃線以外的任意字元; \l 匹配任意小寫字母; \~l 匹配除小寫字母外的任意字元; \o 匹配任意八進位制數字相匹配(0-7); \~o 匹配除八進位制數字外的任意字元; \p 匹配任意半形標點符號; \~p 匹配除半形標點以外的任意字元; \s 匹配任意空白字元(空格、tab); \~s 匹配任意非空白字元; \u 匹配任意大寫字母; \~u 匹配除大寫字母外的任意字元; \w 匹配可成詞的字元(字母、數字及下劃線); \~w 匹配成詞字元外的任意字元; \x 匹配任意十六進製制數字(0-9,a-f, a-f); \~x 匹配除十六進製制數字外的任意字元;

全形部分: \f 匹配任意雙位元組字元(漢字或全形符號); \~f 匹配任意單位元組字元; \a 匹配任意全形ascii字元; \b 匹配任意收錄在big5碼集中的雙位元組字元; \~b 匹配未收錄在big5碼集中的雙位元組字元; \c 匹配任意漢字(不包括符號); \~c 匹配非漢字的雙位元組字元; \d 匹配地支字元(子丑寅卯……); \g 匹配收錄在gb碼集中的雙位元組字元; \~g 匹配非收錄在gb碼集中的雙位元組字元; \k 匹配日文片假名; \k 匹配日文平假名; \m 匹配小寫希臘字母; \m 匹配大寫希臘字母; \n 匹配中文數字(一二三四……); \n 匹配大寫中文數字(壹貳叄肆……); \p 匹配全形標點符號; \r 匹配小寫俄文本母; \r 匹配大寫俄文本母; \s 匹配數學符號; \s 匹配中文序號(⒈⒉⒊⒋……); \t 匹配天乾字元(甲乙丙丁……); \v 匹配豎排標點符號; \y 匹配拼音字元; \y 匹配注音字元; \z 匹配製表字元;

c、字符集

字符集是用一對方括號括起來的字串,用以匹配字符集中的任何乙個字元。比如「[他她它]」匹配單數第三人稱代詞。如果方括號中的第乙個字元是"^",則匹配除指定字元外的任何其它字元。在字符集中,還可以用"-"表示字元的範圍,例如「[a-z]」匹配任何小寫字母。注意盡量不要用「-」表示漢字的範圍,因為漢字並沒有公認的次序,目前是依據漢字內碼來確定範圍的。如果兩個漢字的內碼相差很大,將消耗大量的記憶體,運算也將非常緩慢。為了避免這種現象,限制表示範圍的起始與終止漢字必須位於同一區。如果字符集要包括字元「]」、「^」、「-」或「\」,可以在這些字元前加「\」。例如「[\^xyz]」匹配"^", "x","y"或"z"。另外需要特別指出的是,前面所述的特殊字元及萬用字元,除了"\t"和"\e"外,在字符集中均作為普通字元處理。

字符集的匹配速度比萬用字元慢,所以應該盡可能地使用萬用字元。例如要查詢半形數字時,應該使用\d,而不要使用[0-9],雖然後者也是正確的。

d、子表示式

子表示式是指用一對括弧()括起來的另外乙個正規表示式。使用子表示式有兩種主要的目的。一是改變匹配的優先順序,例如「中|西文軟體」匹配的是「中」或「西文軟體」,但是「(中|西)文軟體」匹配的是「中文軟體」或「西文軟體」。

使用子表示式的另乙個目的,是引用前面匹配到的內容。例如要查詢形如「哈哈」、「嘻嘻」的疊字詞,可以寫「(\c)\1」。這裡「(\c)」匹配任意漢字,而「\1」則引用匹配到的內容。允許在乙個查詢串包含最多9個子表示式,它們的匹配內容可以分別用「\1」,「\2」...「\9」來加以引用。子表示式也可以巢狀另乙個子表示式,子表示式左括號出現的序號為這個表示式的編號。另外需要注意的是,只能引用已經匹配了的子表示式,象上面的例子不可以寫成「\1(\c)」,同理,也不應該引用不同分支中的子表示式,因為乙個正規表示式中只可能有乙個分支被匹配。

e、重複指示

正規表示式的另外乙個強大的功能是重複匹配的能力。前述的任何一種「原子」之後,都可以指定乙個重複指示符。下面列出各種重複指示符:

? 表示前一「原子」可有可無(重複0或1次)。例如 「我們?」匹配「我」或「我們」;

+ 表示前一「原子」至少匹配一次。例如「\d+」匹 配任何乙個無符號整數;

* 表示前一「前子」重複匹配0或多次。例如「\h\w*」 表示許多高階語言對「變數」的定義:以字母或下劃 線開頭,後接任意多個字母數字或下劃線;

表示前一「原子」重複匹配n次。例如「\c啦」 匹配「嘩啦啦啦」或「呼啦啦啦」等;

表示前一「原子」重複匹配n至m次,其中n<=m。如果 n>m,將自動交換m與n的值;

至少重複匹配n次,相當於;

至多重複匹配m次,相當於;

{} 重複任意多次,相當於*。

重複匹配m至n次,匹配次數盡可能少;

至少重複匹配n次,匹配次數盡可能少;

至多重複匹配m次,匹配次數盡可能少,相當於;

重複任意多次,類似於*,但匹配次數盡可能少。

重複指示符只對緊鄰在其前的「原子」起作用,例如「你好+」將匹配「你好」,「你好好」……。但是不會匹配「你好你好」。如果要重複匹配一組原子,可以使用括號(子表示式),如「(你好)+」就會匹配「你好你好」。

需要指出的是,重複指示符與引用子表示式具有不同的含義。重複指示符是重複「匹配」,至於匹配的內容則可以不同;而引用子表示式則是重複匹配的內容。例如,「\d」可以匹配任何乙個兩位數的整數,但是「(\d)\1」只能匹配「11」、「22」、「33」等數字相同兩位數。當然,也可以重複引用子表示式,如「(\d)\1*」可以匹配「2」,「33」、「111」等各位數全同的整數。

如前所述,在正規表示式中,以下字元「*?+.(){}\」具有特殊的含義。如果需要查詢這些字元本身,可以在該字元前加乙個反斜槓「\」。例如查「\def」可以輸入「\\def」。

VBA 正規表示式

1.寫好正規表示式,在資料擷取處理中是十分有優勢的,以下舉幾個例子來學習一下正規表示式的用法 option explicit public function getnum2 str as string with createobject vbscript.regexp global false 全域...

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...