快速開始
教學
工具和語言
範例
參考
書籍評論
正則表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多內容
簡介
正則表示式快速入門
正則表示式教學
替換字串教學
應用程式和語言
正則表示式範例
正則表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for VBscript developers!

VBScript 的正則表示式支援

VBScript 內建支援正則表示式。如果您使用 VBScript 在用戶端驗證網頁上的使用者輸入,使用 VBScript 的正則表示式支援將大幅減少您需要編寫的程式碼量。

Microsoft 在 Internet Explorer 版本 5.5 中對 VBScript 的正則表示式支援進行了一些重大強化。版本 5.5 實作了相當多在先前版本 VBScript 中遺漏的必要正則表示式功能。每當本網站提到 VBScript 時,這些陳述都指的是 VBScript 版本 5.5 的正則表示式支援。

基本上,Internet Explorer 5.5 實作 JavaScript 正則表示式風味。但 IE 5.5 在網頁標準方面的得分並不高。在它實作的 JavaScript 正則表示式和實際標準之間有相當多的差異。很幸運地,大部分都是不太可能影響您的邊緣案例。因此,本網站上關於 JavaScript 正則表示式風味所述的一切也適用於 VBScript。現代版本的 IE 在奇異模式中呈現網頁時仍然使用 IE 5.5 實作。在標準模式中,現代版本的 IE 非常嚴格地遵循 JavaScript 標準。即使已安裝現代版本的 IE,VBScript 正則表示式仍然使用 IE 5.5 實作。

JavaScript 和 VBScript 實作 Perl 風格的正規表示式。然而,它們缺少許多 Perl 和其他現代正規表示式風格中可用的進階功能

RegExp 物件的 1.0 版甚至缺少 惰性量詞 等基本功能。這是本網站不討論 VBScript RegExp 1.0 的主要原因。所有早於 5.5 版的 Internet Explorer 都包含 1.0 版的 RegExp 物件。除了 1.0 和 5.5 版之外,沒有其他版本。

如何使用 VBScript RegExp 物件

你可以透過建立一個或多個 RegExp 物件的執行個體來在 VBScript 中使用正規表示式。這個物件讓你可以在字串中尋找正規表示式比對,並用其他字串取代字串中的正規表示式比對。VBScript 的 RegExp 物件提供的功能相當陽春。然而,對於 VBScript 中通常執行的簡單輸入驗證和輸出格式化任務來說,已經綽綽有餘。

RegExp 物件陽春特性的優點是它非常容易使用。建立一個,放入正規表示式,然後讓它比對或取代。只有四個屬性和三個方法可用。

建立物件後,將你想要搜尋的正規表示式指定給 Pattern 屬性。如果你想要使用文字正規表示式,而不是使用者提供的正規表示式,只要將正規表示式放在雙引號字串中即可。預設情況下,正規表示式會區分大小寫。將 IgnoreCase 屬性設定為 True 以不區分大小寫。 插入符號和美元符號 預設只會比對主旨字串的最開頭和最結尾。如果你的主旨字串包含多行,由換行符號分隔,你可以透過將 Multiline 屬性設定為 True,讓插入符號和美元符號 比對這些行的開頭和結尾。VBScript 沒有 讓點符號比對換行符號字元 的選項。最後,如果你想要 RegExp 物件傳回或取代所有比對,而不是只傳回或取代第一個比對,請將 Global 屬性設定為 True。

'Prepare a regular expression object
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "regex"

設定 RegExp 物件的屬性後,你可以呼叫三個方法中的其中一個來執行三個基本任務之一。 Test 方法接收一個參數:要對其測試正規表示式的字串。 Test 傳回 True 或 False,表示正規表示式是否比對(字串的一部分)。在驗證使用者輸入時,你通常會想要檢查整個字串是否比對正規表示式。為此,請在正規表示式的開頭放置 插入符號,在結尾放置 美元符號,將正規表示式錨定在主旨字串的開頭和結尾。

執行方法也採用一個字串參數。它不會傳回 True 或 False,而是傳回一個 MatchCollection 物件。如果正規表示式完全無法與主旨字串相符,MatchCollection.Count 會為零。如果 RegExp.Global 屬性為 False(預設),MatchCollection 將只包含第一個相符項目。如果 RegExp.Global 為 true,Matches> 將包含所有相符項目。

取代方法採用兩個字串參數。第一個參數為主旨字串,而第二個參數為取代文字。如果 RegExp.Global 屬性為 False(預設),取代 將傳回主旨字串,其中第一個正規表示式相符項目(如果有的話)已用取代文字取代。如果 RegExp.Global 為 true,取代 將傳回主旨字串,其中所有正規表示式相符項目都已取代。

您可以指定一個空白字串作為取代文字。這將導致 取代 方法傳回主旨字串,其中已刪除所有正規表示式相符項目。若要將正規表示式相符項目重新插入為取代項目的一部分,請在取代文字中包含 $&。例如,若要在字串中用方括號括住每個正規表示式相符項目,請指定 [$&] 作為取代文字。如果正規表示式包含 擷取括號,您可以在取代文字中使用 反向參照。取代文字中的 $1 會插入與第一個擷取群組相符的文字,$2 會插入第二個相符群組,依此類推,直到 $9。若要在取代項目中包含一個實際的美元符號,請在傳遞給 取代 方法的字串中放置兩個連續的美元符號。

取得個別相符項目的資訊

RegExp.Execute 方法傳回的 MatchCollection 物件是 Match 物件的集合。它只有兩個唯讀屬性。Count 屬性指出集合包含多少個相符項目。Item 屬性採用一個索引參數(範圍從零到 Count-1),並傳回一個 Match 物件。Item 屬性是預設成員,因此您可以將 MatchCollection(7) 寫成 MatchCollection.Item(7) 的簡寫。

處理集合中所有相符項目的最簡單方法是使用 For Each 建構,例如

' Pop up a message box for each match
Set myMatches = myRegExp.Execute(subjectString)
For Each myMatch in myMatches
  msgbox myMatch.Value, 0, "Found Match"
Next

Match 物件有四個唯讀屬性。FirstIndex 屬性指出相符項目左方字串中的字元數。如果相符項目是在字串的最開頭找到,FirstIndex 會為零。如果相符項目從字串中的第二個字元開始,FirstIndex 會為一,依此類推。請注意,這與 VBScript Mid 函數不同,後者會在您將 start 參數設定為一的情況下擷取字串的第一個字元。Match 物件的 Length 屬性指出相符項目中的字元數。Value 屬性傳回相符的文字。

**SubMatches** 屬性為 Match 物件的字串集合。只有當您的正規表示式有 **擷取群組** 時,它才會保留值。該集合會為每個擷取群組保留一個字串。**Count** 屬性會指出集合中的字串數目。**Item** 屬性會取得一個索引參數,並傳回由擷取群組比對的文字。**Item** 屬性為預設成員,因此您可以將 **SubMatches(7)** 寫成 **SubMatches.Item(7)** 的縮寫。很遺憾地,VBScript 沒有提供任何方式來擷取擷取群組的比對位置和長度。

另一個遺憾的是,**SubMatches** 屬性**沒有**保留完整的正規表示式比對,例如 **SubMatches(0)**。相反地,**SubMatches(0)** 會保留由第一個擷取群組比對的文字,而 **SubMatches(SubMatches.Count-1)** 會保留由最後一個擷取群組比對的文字。這與大多數其他程式語言不同。例如在 **VB.NET** 中,**Match.Groups(0)** 會傳回整個正規表示式比對,而 **Match.Groups(1)** 會傳回第一個擷取群組的比對。請注意,這也與您可以在傳遞給 **RegExp.Replace** 方法的取代文字中使用的反向參照不同。在取代文字中,**$1** 會插入由第一個擷取群組比對的文字,就像大多數其他正規表示式風格一樣。**$0** 沒有被任何東西取代,而是直接插入。

在您的網路瀏覽器中測試 VBScript 的 RegExp 支援

我建立了一個 **範例網頁,顯示 VBScript 的正規表示式支援** 的實際應用。如果您使用的是 Internet Explorer,您現在可以在您的網路瀏覽器中嘗試看看。原始碼顯示在範例下方。

| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |